2009-11-03 102 views
1

我目前有一个包含一堆sqaures作为子项的画布。 这些方位坐在不同的线上。 我想画一个画线的背景(就像记事本上会有假蝇蓝线) 我想通过将它绑定到“线条”集合来动态绘制它 因此,如果有在集合中有2行,将在画布的背景上绘制2行。 我一直在寻找到使用DrawingBrush,但我不知道这是前进的正确道路动态创建画布背景

<DrawingBrush> 
    <DrawingBrush.Drawing> 
    <Line Name=Line1/> 
    <Line Name=Line2/> 
    </DrawingBrush.Drawing> 
</DrawingBrush> 

(BTW上面的代码不工作,它只是解释conecpt)

+0

很棒的主意,我想知道这也+1 – 2009-11-03 16:34:23

+0

因此,您的目标是使用数据绑定而不是编写任何代码?我有一些建议,我只是想确保我理解正确。 – 2009-11-03 18:46:06

+0

是的,这是正确的。我想使用数据绑定(不像上面的xaml) – 2009-11-04 10:34:55

回答

1

试试这个做法。使用新的类画布:

internal class SpecialCanvas : Canvas 
{ 
    ... 

    ObservableCollection<Line> Lines {get; set;} 

    DrawingVisual backgroundVisual = new DrawingVisual; 

    public SpecialCanvas() 
    { 
     this.Background = new VisualBrush(backgroundVisual); 
    } 

    private void OnLinesChanged(...) 
    { 
     using (DrawingContext dc = this.backgroundVisual.RenderOpen()) 
     { 
      // Draw your lines to dc here. 
     } 
    } 

}

+0

这是我寻找的类似解决方案,但是我可以使用DrawingVisual作为背景吗?我不希望该行成为Canvas的子元素(因为我正在处理画布上的拖动事件,因此我不希望行被拖动)。 – 2009-11-04 10:36:03

+1

是的,你可以。只需使用VisualBrush作为背景。 – 2009-11-04 12:41:47

+0

DrawingVisual类中没有Draw()方法吗? – 2009-11-04 16:40:56

0

有很多的方式,你想要做什么你可能做的。对于简单的仅限XAML解决方案,您可以使用itemscontrol。

<Window.Resources> 
    <x:Array x:Key="Lines" Type="{x:Type Line}"> 
     <Line X1="0" X2="400" Y1="25" Y2="25" Stroke="Black" /> 
     <Line X1="0" X2="400" Y1="25" Y2="25" Stroke="Black" /> 
    </x:Array> 

</Window.Resources> 
<Canvas> 
    <ItemsControl ItemsSource="{StaticResource Lines}" /> 

    <Rectangle Height="20" Width="20" Canvas.Left="20" Canvas.Top="5" Stroke="Blue" Fill="Blue" /> 
    <Rectangle Height="20" Width="20" Canvas.Left="120" Canvas.Top="5" Stroke="Blue" Fill="Blue" /> 
    <Rectangle Height="20" Width="20" Canvas.Left="20" Canvas.Top="30" Stroke="Blue" Fill="Blue" /> 
    <Rectangle Height="20" Width="20" Canvas.Left="120" Canvas.Top="30" Stroke="Blue" Fill="Blue" /> 
</Canvas>