Pregunta

Estoy usando WPF con .NET 3.0.

I tiene un DataTemplate relativamente simple definida como la CellTemplate para un GridView. Espero propiedad VisualTree del DataTemplate para contener un FrameworkElementFactory, pero la propiedad es nulo cuando intento acceder a él desde el evento GridViewColumnHeader.Click. ¿Por qué es la nula VisualTree? Necesito acceder a él. Aquí está la definición 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>

Y aquí está el controlador de eventos:

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

    // error! VisualTree is null!
    //gvch.Column.CellTemplate.VisualTree.GetType(); 
}
¿Fue útil?

Solución

Este es el comportamiento conocido y esperado. No puedo encontrar una MSDN u otra citación "autoridad" en este momento, pero esta foros de MSDN publicar explica (más o menos!):

  

propiedad FrameworkTemplate.VisualTree   ... se utiliza principalmente cuando se   crear mediante programación   DataTemplate / ControlTemplate en el código,   Al definir   DataTemplate / ControlTemplate usando   XAML, esta propiedad será nula,   porque WPF utiliza otro mecanismo   Para instanciar y constructo XAML   plantillas generadas . (énfasis   agregado)

Así que la propiedad VisualTree no se rellena cuando una plantilla se carga desde XAML:. Que sólo se rellena si se construye la plantilla de código usando FrameworkElementFactory

Para obtener el contenido de una plantilla definida en XAML, llame FrameworkTemplate.LoadContent (). Esto se materializará una instancia de la plantilla y darle el elemento raíz - a continuación, puede perforar en propiedades o fijaciones como requeridos y establecidos. Es hasta usted a la ranura del ejemplo materializado en la ventana que contiene o árbol visual de control de embargo, por lo que probablemente va a querer encapsular esto!

Otros consejos

La razón detrás de Visual Árbol siendo nula es porque la propiedad de Visual árbol está más cerca de Lógico árbol en lugar de Visual Uno . contenido real de la plantilla se almacena en TemplateContent objeto que no tiene miembros públicos, usted tendrá que usar LoadContent método.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top