2009-11-03 128 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>