Ich versuche, über das Benutzersteuerelement auf das übergeordnete Fenster zuzugreifen.
userControl1 uc1 = new userControl1();
mainGrid.Children.Add(uc1);
durch diesen Code lade ich userControl1
in das Hauptgitter.
Wenn ich jedoch auf eine Schaltfläche in userControl1
klicke, möchte ich einen anderen userControl2
in mainGrid
laden, der sich im Hauptfenster befindet.
Hast du es versucht
Window yourParentWindow = Window.GetWindow(userControl1);
Dies ruft das Root-Level-Fenster auf:
Window parentWindow = Application.Current.MainWindow
oder das unmittelbare übergeordnete Fenster
Window parentWindow = Window.GetWindow(this);
Der einzige Grund, warum das vorgeschlagen wurde
Window yourParentWindow = Window.GetWindow(userControl1);
das hat bei dir nicht funktioniert, weil du es nicht auf den richtigen Typ gebracht hast:
var win = Window.GetWindow(this) as MyCustomWindowType;
if (win != null) {
win.DoMyCustomWhatEver()
} else {
ReportError("Tough luck, this control works only in descendants of MyCustomWindowType");
}
Wenn es nicht muss sein viel mehr Kopplung zwischen Ihrem Fenstertyp und Ihrer Steuerung gibt, halte ich Ihren Ansatz für schlechtes Design.
Ich würde vorschlagen, das Raster, für das das Steuerelement als Konstruktorparameter fungiert, zu übergeben, es in eine Eigenschaft zu verwandeln oder dynamisch in einem beliebigen Window
nach einem geeigneten (root?) Raster zu suchen.
Ändern Sie den Konstruktor des UserControl, um einen Parameter des MainWindow-Objekts zu akzeptieren. Übergeben Sie dann das MainWindow-Objekt an UserControl, wenn Sie im MainWindow erstellen.
Hauptfenster
public MainWindow(){
InitializeComponent();
userControl1 uc1 = new userControl1(this);
}
Nutzerkontrolle
MainWindow mw;
public userControl1(MainWindow recievedWindow){
mw = recievedWindow;
}
Beispielereignis in der UserControl
private void Button_Click(object sender, RoutedEventArgs e)
{
mw.mainGrid.Children.Add(this);
}
Danke für die Hilfe, Jungs. Ich habe eine andere Lösung
((this.Parent) as Window).Content = new userControl2();
das ist perfekt funktioniert
Erstellen Sie eine statische Instanz des Hauptfensters. Sie können es einfach in Ihrem Benutzersteuerelement aufrufen:
Siehe dieses Beispiel:
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)
}
}