2010-05-23 4 views
1

Je suis en train de lier un Viewbox à un Canvas qui est créé dynamiquement comme ceci:Liaison d'un Viewbox à une toile

 <ListBox.ItemTemplate> 
      <DataTemplate> 
       <DockPanel> 
        <Viewbox> 
         <ContentPresenter Content="{Binding Canvas}"/> 
        </Viewbox> 
       </DockPanel> 
      </DataTemplate> 
     </ListBox.ItemTemplate> 

Cela fonctionne bien aussi longtemps que le Canvas n'a pas d'enfants, mais dès que le Canvas a des enfants, il n'est pas montré. Qu'est-ce que j'oublie ici?

Répondre

2

Comment savez-vous que cela fonctionne? Un Canvas est juste un Panel avec zéro largeur/hauteur. Même s'il a des enfants, ses dimensions vont encore être 0,0. Vous devez définir explicitement Width et Height à une valeur différente de zéro pour qu'il apparaisse. Collez l'extrait suivant dans XamlPad ou effectuez un test dans votre propre application. Maintenant, retirez Width ou Height et il disparaîtra.

<Viewbox> 
    <ContentPresenter> 
     <ContentPresenter.Content> 
     <Canvas Background="Red" Width="1" Height="1"> 
      <TextBlock Canvas.Left="10" Canvas.Top="20" Text="123" /> 
     </Canvas> 
     </ContentPresenter.Content> 
    </ContentPresenter> 
</Viewbox> 
0

Oublier que j'ai jamais demandé :-)

j'ai fait une exception lors de la création des enfants de la toile, et à son tour, a causé la toile pour ne pas être montré. Je suis triste de dire que ce n'est pas la première fois que je l'ai fait cette erreur, et il est sans doute pas la dernière fois soit:

TextBlock tb = new TextBlock(); 
tb.SetValue(Canvas.LeftProperty, 5); 
tb.SetValue(Canvas.TopProperty, 5); 

« 5 » est pas une valeur valide pour « gauche » ou « Top » . Il devrait bien sûr être

TextBlock tb = new TextBlock(); 
tb.SetValue(Canvas.LeftProperty, 5.0); 
tb.SetValue(Canvas.TopProperty, 5.0); 

Et comme il a été créé dans le cadre de la liaison de données, aucune boîte de dialogue d'exception n'a été affichée. Dans l'ensemble ... DOOOOH :-) :-)