es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Acceder a un elemento de instancia de control UWP que tenga asignado un ControlTemplate.

Tengo el siguiente código dentro de MainPage.xaml:

<Page ...>
   <VariableSizedWrapGrid Name="ContentGrid"/>
</Page>

Sólo es una marca primitiva para crear un control de cuadrícula que contendrá algunas instancias de CalendarView.

Luego, en MainPage.xaml.cs, genero un par de calendarios:

namespace App1 {

public sealed partial class MainPage : Page {

    public MainPage() {
        this.InitializeComponent();
        for (int i = 1; i <= 12; i++)
        {
            CalendarView instance = new CalendarView();
            instance.CalendarViewDayItemChanging += myEvent;
            ContentGrid.Children.Add(instance);
        }
    }

    private void myEvent(CalendarView sender, CalendarViewDayItemChangingEventArgs args){...}

}

Sin embargo, estos calendarios tienen contenido interno que ha anulado el estilo que se define en App.xaml:

<Application ...>
    <Application.Resources>
        <ResourceDictionary>
        <Style x:Key="CalendarViewDayItemRevealStyle" TargetType="CalendarViewDayItem">
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="CalendarViewDayItem">
                        <Grid x:Name="itemgrid" />
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>

        <Style TargetType="CalendarViewDayItem" BasedOn="{StaticResource CalendarViewDayItemRevealStyle}" />

    </ResourceDictionary>
</Application.Resources>

Cada instancia de control de calendario contiene múltiples controles de CalendarViewDayItem.
Cada uno de estos controles de CalendarViewDayItem renderizará su contenido con la plantilla anterior.

La pregunta es: ¿Cómo acceder al elemento de cuadrícula específico de la instancia (aquí con el nombre “itemgrid”)?

En un mundo ideal, imaginaria algo como esto:

private void myEvent(CalendarView sender, CalendarViewDayItemChangingEventArgs args){
    CalendarViewDayItem instance = args.Item;
    ControlTemplate instance_template = instance.Template;
    Grid g = (Grid)instance_template.getValue().getElementByName("itemgrid");
}

También sé que este acceso sólo debería funcionar cuando la instancia está suficientemente construida.
Además, tal vez algún tipo de brujería de vinculación específica de la instancia podría funcionar.
Esta es una pregunta similar a https://stackoverflow.com/questions/8126700
pero estamos en UWP aquí.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para acceder al elemento de cuadrícula específico de la instancia con el nombre “itemgrid”, puede utilizar el siguiente código:

    private void myEvent(CalendarView sender, CalendarViewDayItemChangingEventArgs args){
        CalendarViewDayItem instance = args.Item;
        ControlTemplate instance_template = instance.Template;
        Grid g = (Grid)instance_template.LoadContent();
        var itemGrid = (Grid)VisualTreeHelper.GetChild(g, 0);
        if (itemGrid.Name == "itemgrid")
        {
            // Acceda al elemento de cuadrícula específico de la instancia aquí
        }
    }
    

    Este código primero recupera el ControlTemplate de la instancia de CalendarViewDayItem y carga su contenido. Luego utiliza el VisualTreeHelper para recuperar el primer elemento secundario de la cuadrícula, que debería ser el elemento con el nombre “itemgrid”. Al verificar el nombre de este elemento, puede asegurarse de que está accediendo al elemento correcto para la instancia actual. Finalmente, puede acceder al elemento de cuadrícula específico de la instancia dentro del bloque if.

Comments are closed.