web-dev-qa-db-fra.com

Fenêtre parent d'accès à partir du contrôle de l'utilisateur

J'essaie d'accéder à la fenêtre parente à partir du contrôle de l'utilisateur. 

userControl1 uc1 = new userControl1();

mainGrid.Children.Add(uc1);

à travers ce code, je charge userControl1 dans la grille principale.

Mais lorsque je clique sur un bouton dans userControl1, je souhaite charger un autre userControl2 dans mainGrid qui se trouve dans la fenêtre principale?

26
Lazy Lion

As-tu essayé

Window yourParentWindow = Window.GetWindow(userControl1);
45
Vlad Bezden

Cela donne la fenêtre de niveau racine:

Window parentWindow = Application.Current.MainWindow

ou la fenêtre parent immédiat

Window parentWindow = Window.GetWindow(this);
14
seabass2020

La seule raison pour laquelle le suggéré

Window yourParentWindow = Window.GetWindow(userControl1);

cela n'a pas fonctionné pour vous parce que vous ne l'avez pas jeté dans le bon type:

var win = Window.GetWindow(this) as MyCustomWindowType;

if (win != null) {
    win.DoMyCustomWhatEver()
} else {
    ReportError("Tough luck, this control works only in descendants of MyCustomWindowType");
}

À moins que il doit y avoir beaucoup plus de couplage entre votre type de fenêtre et votre commande, je considère votre approche mauvaise conception.

Je suggérerais de transmettre la grille sur laquelle le contrôle fonctionnera en tant que paramètre de constructeur, d'en faire une propriété ou de rechercher une grille (racine?) Appropriée dans une variable Window de manière dynamique.

2
Miloslav Raus

Modifiez le constructeur de UserControl pour accepter un paramètre d'objet MainWindow. Puis passez l'objet MainWindow à UserControl lors de la création dans MainWindow.

Fenêtre principale

public MainWindow(){
    InitializeComponent();
    userControl1 uc1 = new userControl1(this);
}

UserControl

MainWindow mw;
public userControl1(MainWindow recievedWindow){
    mw = recievedWindow;
}

Exemple d'événement dans UserControl

private void Button_Click(object sender, RoutedEventArgs e)
{
    mw.mainGrid.Children.Add(this);
}
1
Suneth Thotagamuwa

Merci de m'aider les gars. j'ai une autre solution

 ((this.Parent) as Window).Content = new userControl2();

c'est parfaitement fonctionne

1
Lazy Lion

Créez une instance statique de la fenêtre principale, vous pouvez simplement l'appeler dans votre contrôle utilisateur:

Voir cet exemple:

Window1.cs

 public partial class Window1 : Window
    {
        public Window1()
        {
            InitializeComponent();
            _Window1 = this;
        }
        public static Window1 _Window1 = new Window1();

    }

UserControl1.CS

public partial class UserControl1 : UserControl
    {
        public UserControl1()
        {
            InitializeComponent();

        }
        private void AddControl()
        {
           Window1._Window1.MainGrid.Children.Add(usercontrol2)
        }
    }
0
KF2