Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Probleme mit schließen/ändern von UserControls
Wanna
myCSharp.de - Member



Dabei seit:
Beiträge: 11

Themenstarter:

Probleme mit schließen/ändern von UserControls

beantworten | zitieren | melden

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
Dieser Beitrag wurde 2 mal editiert, zum letzten Mal von Wanna am .
private Nachricht | Beiträge des Benutzers
chilic
myCSharp.de - Experte



Dabei seit:
Beiträge: 2111

beantworten | zitieren | melden

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?
private Nachricht | Beiträge des Benutzers
Wanna
myCSharp.de - Member



Dabei seit:
Beiträge: 11

Themenstarter:

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
chilic
myCSharp.de - Experte



Dabei seit:
Beiträge: 2111

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
Wanna
myCSharp.de - Member



Dabei seit:
Beiträge: 11

Themenstarter:

beantworten | zitieren | melden

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
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Wanna am .
private Nachricht | Beiträge des Benutzers
chilic
myCSharp.de - Experte



Dabei seit:
Beiträge: 2111

beantworten | zitieren | melden

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.
Zitat
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.
private Nachricht | Beiträge des Benutzers
Pupps
myCSharp.de - Member



Dabei seit:
Beiträge: 3

beantworten | zitieren | melden

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

mfg
private Nachricht | Beiträge des Benutzers
Wanna
myCSharp.de - Member



Dabei seit:
Beiträge: 11

Themenstarter:

beantworten | zitieren | melden

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 ...
private Nachricht | Beiträge des Benutzers
Pupps
myCSharp.de - Member



Dabei seit:
Beiträge: 3

beantworten | zitieren | melden

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

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 :D (IsVisibleChanged)

mfg
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Pupps am .
private Nachricht | Beiträge des Benutzers
Wanna
myCSharp.de - Member



Dabei seit:
Beiträge: 11

Themenstarter:

beantworten | zitieren | melden

Hi,

nein es sind nicht nur zwei UserControls. Es sind viele :D
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
private Nachricht | Beiträge des Benutzers
_Cashisclay
myCSharp.de - Member



Dabei seit:
Beiträge: 279

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
KroaX
myCSharp.de - Member

Avatar #avatar-4080.jpg


Dabei seit:
Beiträge: 315
Herkunft: Köln

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
Th69
myCSharp.de - Experte

Avatar #avatar-2578.jpg


Dabei seit:
Beiträge: 3954

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers