4 votes

WPF - Manipulation de VisualState à partir d'un UserControl

Je dois deux États visuels définis dans la grille LayoutRoot de mon MainWindow comme suit :

Cela fonctionne bien en passant d'un état à un autre dans le code-behind de MainWindow, comme ceci :

    void MainWindow_Loaded(object sender, RoutedEventArgs e)
    {
        //ExtendedVisualStateManager.GoToElementState(this.LayoutRoot as FrameworkElement, "LoggedOff", false);        
    }

Mais maintenant, j'ai besoin de pouvoir passer d'un état à un autre à partir d'un usercontrol à l'intérieur de MainWindow...

J'ai essayé cela :

    private void btnOk_Click(object sender, System.Windows.RoutedEventArgs e)
    {
        MainWindow parent = new MainWindow();
        Grid root = new Grid();
        root = (Grid)parent.FindName("LayoutRoot");
        ExtendedVisualStateManager.GoToElementState(root as FrameworkElement, "LoggedOn", true);
    }

Et cela me donne l'exception suivante :

System.NullReferenceException a été géré Message="La référence d'objet n'est pas définie à une instance d'un objet." Source="WPFToolkit"

Est-ce que quelqu'un sait comment passer d'un état à un autre à partir d'un usercontrol ?

Merci,

Josi

1voto

Dan Bryant Points 19021

Je recommande de définir une interface pour basculer entre les états. Le formulaire peut implémenter l'interface et il peut soit passer explicitement l'interface au contrôle, soit le contrôle peut interroger son parent pour voir si l'interface est implémentée. De cette façon, le contrôle utilisateur n'est pas étroitement couplé à son conteneur, mais seulement au comportement qu'il attend du conteneur.

À noter que le fait qu'un contrôle utilisateur modifie l'état de son conteneur est une conception inhabituelle. Vous voudrez peut-être envisager s'il existe un moyen alternatif de structurer l'exigence.

Une interface possible :

public interface IStateChanger
{
    void GoToElementState(string state);    
}

Vous pouvez faire en sorte que votre MainWindow implémente cette interface :

    void IStateChanger.GoToElementState(string state)
    {
        ExtendedVisualStateManager.GoToElementState(this.LayoutRoot as FrameworkElement, state, false);        
    }

Ensuite, votre contrôle, en suivant votre exemple, peut faire ceci :

    private void btnOk_Click(object sender, System.Windows.RoutedEventArgs e)
    {
        MainWindow parent = new MainWindow();
        if (parent is IStateChanger)
            ((IStateChanger)parent).GoToElementState("LoggedOn");
    }

0voto

Jay Points 27907

Créez un événement public sur votre contrôle utilisateur auquel le parent peut s'abonner; l'événement peut ensuite être utilisé comme déclencheur pour la transition d'état.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X