it-swarm.com.de

Greifen Sie über die Benutzersteuerung auf das übergeordnete Fenster zu

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.

26
Lazy Lion

Hast du es versucht

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

Dies ruft das Root-Level-Fenster auf:

Window parentWindow = Application.Current.MainWindow

oder das unmittelbare übergeordnete Fenster

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

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.

4
Miloslav Raus

Ä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);
}
1

Danke für die Hilfe, Jungs. Ich habe eine andere Lösung

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

das ist perfekt funktioniert

1
Lazy Lion

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)
        }
    }
0
KF2