Laden...

Probleme mit schließen/ändern von UserControls

Erstellt von Wanna vor 13 Jahren Letzter Beitrag vor 4 Jahren 6.806 Views
W
Wanna Themenstarter:in
11 Beiträge seit 2010
vor 13 Jahren
Probleme mit schließen/ändern von UserControls

Hi,

bin relativ neu im C# Bereich. Habe umfassend Google und die Forensuche bemüht aber leider nichts gefunden. Bin mir sicher, dass mein Problem relativ einfach gelöst werden kann. Aber finde die Lösung leider nicht selbst. Habe vielleicht auch einfach nach dem falschen gesucht:

Hier erst einmal was ich habe:
MainWindow.xaml.cs:


namespace xxx
{
    /// <summary>
    /// Interaktionslogik für MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {   
        public MainWindow()
        {
            InitializeComponent();

            contentControlMainWindow.Content = new Startfenster();
        }

        private void MenuItemBeenden_Click(object sender, RoutedEventArgs e)
        {
            //Progamm Beenden
            Application.Current.Shutdown();
        }

        private void MenuItemMannschaftErstellen_Click(object sender, RoutedEventArgs e)
        {
            //Fenster bereitstellen für neue Mannschaft
            contentControlMainWindow.Content = new MannschaftErstellen();
        }
    }
}

Die einzelnen UserControls möchte ich in einem ContentControl darstellen. Ist die Lösung wie ich sie hier habe korrekt (wird zumindest das gemacht was ich möchte). Oder ist das vom Code her eher unsauber?

Nun aber zum eigentlichen Problem:


namespace xxx
{
    /// <summary>
    /// Interaktionslogik für MannschaftErstellen.xaml
    /// </summary>
    public partial class MannschaftErstellen : UserControl
    {
        public MannschaftErstellen()
        {
            InitializeComponent();
        }

        private void btnMannschaftErfassen_Abbrechen_Click(object sender, RoutedEventArgs e)
        {
            //Fenster Schließen
        }
    }
}

Beim Click auf den Abbrechen Button (btnMannschaftErfassen_Abbrechen_Click...) möchte ich, dass das Usercontrol MannschaftErstellen geschlossen wird und wieder mein UserControl Startfenster geladen wird.

Meine bisherigen Versuche über Events, die soweit ich verstanden habe nur in Klassen verwendet werden können, sind gescheitert.

Ich habe momentan einfach das Problem, wie ich vom UserControl aus meinem ContentControl im MainWindow sagen kann, es solle wieder das Startfenster Laden und wie ich das UserControl MannschaftErstellen schließen kann.

Ich hoffe ihr könnt mir helfen.

Danke,
Wanna

C
2.121 Beiträge seit 2010
vor 13 Jahren

Was bedeutet es ein Control zu "schließen"?
Meinst du ausblenden und stattdessen ein anderes anzeigen? Das wär aber etwas ganz anderes als dein Kommentar "Fenster schließen".
Hide und Show kennst du, bzw. die Eigenschaft Visible?

W
Wanna Themenstarter:in
11 Beiträge seit 2010
vor 13 Jahren

Hi,

mir sind die Befehle mehr oder weniger schon bekannt ja. Aber der unterschied zwischen schließen und "hiden" ist ja der, dass wenn ich das Fenster schließe, es beim nächsten aufruf neu instanziieren muss. Beim HIDE muss ich es ja nur wieder anzeigen. Verstehe ich das richtig?

Wenn ja würde ich es schon ganz gerne schließen können. Um beim nächsten mal wieder ein neues (mit leeren Feldern) aufrufen zu können.

Mein Problem ist ja nachwievor, wie ich aus dem Usercontrol Fenster aus mein ConentControl Elemen im MainWindow ansteuern kann um z.B. wieder das Startfenster also content festzusetzen.

Gleichzeitig sollte sich natürlich das momentan im content angezeigte fenster schließen

Grüße,
Wanna

C
2.121 Beiträge seit 2010
vor 13 Jahren

Wie das beim Close bei einem Fenster ist weiß ich ehrlich gesagt nicht genau. Ich glaub das kann man dann schon auch wiederverwenden. Ich tu sowas nicht.

Ich komm mit deinen Formulierungen noch nicht klar. Ein Control ist ein Element innerhalb eines Fensters. Fenster schließt man, Controls nicht. Die blendet man höchstens aus.
Du bringst das irgendwie noch durcheinander.

W
Wanna Themenstarter:in
11 Beiträge seit 2010
vor 13 Jahren

Mhh, das ist mir schon klar. Ich versuche mal das ganze anders zu beschreiben:

Mein Control im MainWindow:

contentControlMainWindow.Content = new Startfenster();

Hier lade ich das Startfenster.

Mit klick auf einen Button lade ich das Fenster Mannschafterstellen:

contentControlMainWindow.Content = new MannschaftErstellen();

wenn ich jetzt in dem geladenen Fenster MannschaftErstellen auf den Button "Abbrechen" klicke möchte ich.

        
private void btnMannschaftErfassen_Abbrechen_Click(object sender, RoutedEventArgs e)
{
     //Hier möchte ich eigentlich das contentControlMainWindow.Content steuern
}

Das das Fenster zugeht und wieder das Startfenster angezeigt wird. Ich schaffe es aber nicht aus dem Fenster aus das "contentControlMainWindow.Content" zu steuern.

Nun klarer was ich vorhabe?

EDIT:
Habe nun herausgefunden, dass ich über

this.Visibility = Visibility.Hidden;

mein Fesnter ausblenden kann. Aber wie ich dann mein Startfenster wieder lade schaffe ich nach wie vor noch nicht!

Grüße,
Wanna

C
2.121 Beiträge seit 2010
vor 13 Jahren

Versuch es mal ein bisschen abstrakter. Erklär einfach mal zum Beispiel dass du ein Fenster hast in dem du mehrere Controls darstellen willst. Ohne wie die heißen, dafür aber mit der Info um was für einen Typ (Klasse) es sich handelt. Und da soll dann irgendwas passieren, das bisher noch nicht so durchgedrungen ist. Inhalte, in deinem Fall Bezeichner ohne weitere Info, lenken gerne vom eigentlichen Problem ab.

Aber wie ich dann mein Startfenster wieder lade...

Um mal böse zu sein und bei deinem Begriff zu bleiben, laden geht mit File.Read... 😉
Aber bei einem Fenster? Ein Fenster wird mit new erzeugt und mit Show angezeigt. Was meinst du mit laden? Und - gehts tatsächlich um ein Fenster oder um ein Control? Du schreibst "contentControlMainWindow.Content = new Startfenster();", also praktisch Control = Fenster.

Es ist schon wichtig das so zu beschreiben dass man vom gleichen spricht. Nur dann passt die Antwort auch zur Frage.

P
3 Beiträge seit 2010
vor 13 Jahren

Hey,
also entweder hab ichs jetzt falsch verstanden, oder dir wirdn
this.Close();
weiterhelfen 🤔

mfg

W
Wanna Themenstarter:in
11 Beiträge seit 2010
vor 13 Jahren

Versuch 3:

Ich habe eine WPF Anwendung mit einem Fenster. In diesem Fenster habe ich ein Element vom Typ ContentControl. In dieses ContentControl lade ich verschiedene UserControls.

Mein Problem. Vom Hauptfenster, in welchem das ContentControl erstellt wurde kann ich ja ganz normal darauf zugreifen. Wenn ich jetzt ein UserControl in diesem ContentControl darstellen lasse, kann ich jedoch innerhalb des UserControls nicht mehr auf das ContentControl zugreifen um ihm beispielsweise zu sagen "Hey, ich bin fertig, du kannst nun das andere UserControl" anzeigen.

Ich weiß ehrlich gesagt nicht mehr wie ich das noch anders beschreiben soll ...

P
3 Beiträge seit 2010
vor 13 Jahren

also du hast 2 usercontrols in einem ContentControl und willst die nacheinander anzeigen lassen? hoffe ich habs richtig verstanden 😄

ich bin gerade nich sicher aber vlt kannste dir das control in deinen children raussuchen und wegschmeissen? 😉
ansonsten würde für deine zwecke nicht auch reichen wendes unsichtbar machst, und dem einen sacht es soll sichbar werden, wenn des andere unsichtbar wird 😄 (IsVisibleChanged)

mfg

W
Wanna Themenstarter:in
11 Beiträge seit 2010
vor 13 Jahren

Hi,

nein es sind nicht nur zwei UserControls. Es sind viele 😄
Das mit dem verstecken mache ich ja schon. Ich will einfach nur aus dem UserControl das ContentControl ansteuern können. Hat denn da niemand eine Lösung parat?

Grüße

_
277 Beiträge seit 2014
vor 4 Jahren

Servus,

bin gerade auf das selbe Problem gestoßen, der Kollege vor mir steuert aus dem MainWindow mit einer ContentControl UserControl's an, allerdings wie krieg ich denn ein UserControl wieder geschlossen um mir quasi im MainWindow den Rückgabewert zu holen um das dann weiterzuverarbeiten?

Grüße

301 Beiträge seit 2009
vor 4 Jahren

Du musst zunächst in deinem UserControl ( welches ja im ContentControl gehostet wird ) erstmal definieren WANN dass denn überhaupt passiert. Sprich dein im MainWindow befindliches Usercontrol muss signalisieren "Hey ich bin hier fertig" damit dein Mainwindow weiß wann es einen Wert dieses UserControls auslesen muss um dies dann weiter zu verarbeiten.

Zumindest von der Idee her.

Die eigentliche Umsetzung klingt dabei noch ziemlich dirty. Was du eigentlich möchtest ist so eine Art Content Browser für deine Anwendung. Das ist nicht unbedingt trivial. Ich selbst löse sowas mit ViewModels und Datatemplates und navigiere nur zwischen den einzelnen ViewModels hin und her. Dabei wissen die einzelnen ViewModels allerdings nie etwas voneinander. Sprich sie sind nicht abhängig voneinander.

Eventuell wäre es in deinem Fall leichter wenn du hier mit einem Dialog Fenster ( Modal ) arbeitest. Dabei kannst du einfacher mit Ergebnissen arbeiten? Zumindest mache ich das meistens so. Die Visualisierung eines modalen Dialogs kannst du ja selbst beeinflussen.

4.931 Beiträge seit 2008
vor 4 Jahren

Verwende ein Ereignis dafür: [FAQ] Eigenen Event definieren / Information zu Events (Ereignis/Ereignisse)

Dein UserControl (bzw. dessen ViewModel) wirft dieses Ereignis und das MainWindow (bzw. dessen ViewModel) abonniert dieses dann und ändert dann den Content.

Btw: Bei WPF solltest du [Artikel] MVVM und DataBinding verwenden!
Mittels DataBinding könntest du dann eine Eigenschaft IsClosed (oder IsCanceled) (bzw. als Command Close (bzw. Cancel)) stattdessen benutzen.