2009-11-03 15 views
1

J'ai actuellement une toile qui contient un tas de sqaures comme ses enfants. Ces carrés sont situés sur des lignes différentes. Je voudrais dessiner un arrière-plan de la toile qui trace des lignes (comme un bloc-notes aurait Feint lignes bleues sur le papier) Je voudrais attirer cette dynamique en le liant à une collection de « lignes » donc s'il y a 2 lignes dans la collection, 2 lignes seront dessinées sur le fond de la toile. que je recherchais en utilisant DrawingBrush, mais je ne suis pas sûr que ce soit la bonne façon avantCréation d'un fond de toile Dynamiquement

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

(BTW Le code ci-dessus ne fonctionne pas, il est juste d'expliquer le conecpt)

+0

idée Cool, je voudrais savoir ce aussi +1 –

+0

Donc, votre objectif est d'utiliser la liaison de données et ne pas écrire un code? J'ai quelques suggestions, je veux juste m'assurer de bien comprendre. –

+0

Oui, c'est correct. Je voudrais utiliser la liaison de données (pas comme le xaml ci-dessus) –

Répondre

1

Try this approche. Utilisez une nouvelle classe pour votre toile:

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

Ceci est une solution simmilar à ce que je cherchais, mais puis-je utiliser le DrawingVisual comme arrière-plan? Je ne veux pas que la ligne soit un élément enfant du canevas (THats parce que je gère les événements de glisser sur le canevas et je ne veux pas que les lignes soient glissées). –

+1

Oui, vous pouvez. Utilisez simplement VisualBrush en arrière-plan. –

+0

Il n'y a pas de méthode Draw() dans la classe DrawingVisual? –

0

Il y a beaucoup de façons dont vous pourriez faire ce que vous voulez faire. Pour une solution uniquement XAML simple, vous pouvez simplement utiliser un 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>