Question

J'utilise WPF avec .NET 3.0.

J'ai un DataTemplate relativement simple définie comme la CellTemplate pour un GridView. Je pense la propriété VisualTree du DataTemplate pour contenir un FrameworkElementFactory, mais la propriété est nulle lorsque je tente d'y accéder à partir de l'événement GridViewColumnHeader.Click. Pourquoi le null VisualTree? J'ai besoin d'y accéder. Voici la définition 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>

Et voici le gestionnaire d'événements:

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

    // error! VisualTree is null!
    //gvch.Column.CellTemplate.VisualTree.GetType(); 
}
Était-ce utile?

La solution

Ce comportement est connu et attendu. Je ne peux pas trouver un MSDN ou une autre citation « autorité » en ce moment, mais ce forum MSDN affichent explique (un peu!):

  

propriété FrameworkTemplate.VisualTree   ... est principalement utilisé lorsque vous   créer par programme   DataTemplate / ControlTemplate dans le code,   lors de la définition   DataTemplate / ControlTemplate en utilisant   XAML, cette propriété sera nulle,   parce que WPF utilise un autre mécanisme   à instancier et construire XAML   modèles générés . (accent   ajoutée)

Alors la propriété VisualTree n'est pas renseigné lorsqu'un modèle est chargé à partir XAML:. Il est peuplé que si vous construisez le modèle dans le code en utilisant FrameworkElementFactory

Pour obtenir le contenu d'un modèle défini en XAML, appelez FrameworkTemplate.LoadContent (). Cela se concrétisera un exemple du modèle et vous donner l'élément racine - vous pouvez percer dans des propriétés comme nécessaires et de définir ou de fixations. Il est à vous de fente l'instance matérialisée dans la fenêtre contenant ou arbre visuel de contrôle, donc vous voudrez probablement résumer cela!

Autres conseils

La raison de l'arbre VISUAL null est parce que la propriété Visual Tree est plus proche de Arbre logique plutôt que Visual One . contenu réel du modèle est stocké dans TemplateContent objet n'a pas de membres du public, vous devrez utiliser LoadContent méthode .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top