Domanda

Sto usando WPF con .NET 3.0.

Ho un relativamente semplice DataTemplate definito come il CellTemplate per un GridView. Mi aspetto di proprietà VisualTree del DataTemplate per contenere un FrameworkElementFactory, ma la proprietà è null quando provo ad accedere dall'evento GridViewColumnHeader.Click. Perché il nulla VisualTree? Ho bisogno di accedervi. Ecco la definizione ListView:

<ListView ItemsSource="{Binding Stuff}" GridViewColumnHeader.Click="Header_Click">
    <ListView.View>
        <GridView>
            <GridViewColumn Width="28">
                <GridViewColumn.CellTemplate>
                    <DataTemplate>
                        <Image Name="statusImage" Width="16" Height="16" Source="../Images/media_play_green_16x16.png"/>
                    </DataTemplate>
                </GridViewColumn.CellTemplate>
            </GridViewColumn>
        </GridView>
    </ListView.View>
</ListView>

E qui è il gestore di eventi:

private void Header_Click(object sender, RoutedEventArgs e)
{
    GridViewColumnHeader gvch = e.OriginalSource as GridViewColumnHeader;

    // error! VisualTree is null!
    //gvch.Column.CellTemplate.VisualTree.GetType(); 
}
È stato utile?

Soluzione

Questo è il comportamento noto e previsto. Non riesco a trovare un MSDN o altra citazione "autorevole" in questo momento, ma questo forum MSDN inviare spiega (sorta di!):

  

proprietà FrameworkTemplate.VisualTree   ... è utilizzato principalmente quando si   a livello di codice creare   DataTemplate / ControlTemplate in codice,   Nel definire   DataTemplate / ControlTemplate utilizzando   XAML, questa proprietà sarà nullo,   perché WPF utilizza un altro meccanismo   istanziare e costruire XAML   template generati . (enfasi   aggiunto)

Quindi, la proprietà VisualTree non viene popolata quando un modello viene caricato da XAML:. È popolato solo se si costruisce il modello in codice utilizzando FrameworkElementFactory

Per ottenere il contenuto di un modello definito in XAML, chiamare FrameworkTemplate.LoadContent (). Ciò si concretizzerà un'istanza del modello e vi darà l'elemento principale - si può quindi forare come proprietà o legature richieste e set. Spetta a voi per scanalare l'istanza materializzata nella finestra che contiene o albero visuale del controllo, però, quindi probabilmente vi verrà voglia di incapsulare questo!

Altri suggerimenti

Il motivo dietro Del Visual essere Albero nulla è perché la proprietà Visual Tree è più vicino al Logical Albero , piuttosto che visivo One . contenuto effettivo del modello è memorizzato in TemplateContent oggetto che non ha membri pubblici, si dovrà utilizzare LoadContent metodo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top