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?
As-tu essayé
Window yourParentWindow = Window.GetWindow(userControl1);
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);
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.
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);
}
Merci de m'aider les gars. j'ai une autre solution
((this.Parent) as Window).Content = new userControl2();
c'est parfaitement fonctionne
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)
}
}