Multi Form/Bereiche austauschen/...

04/16/2014 13:35 Mostey#16
Quote:
Originally Posted by tolio View Post
webseiten sind außendarstellung, da muss immer alles schön und glänzend sein. genau wie werbung.

aber ein produkt ist eben nicht werbung sondern das produkt und muss deswegen das können was es verspricht. die winform controls sind einfach funktional und tun was sie sollen.

es ist nicht so das ich sagen würde man sollte kein wpf nutzen, aber wenn nachher die hälfte der entwicklungszeit für gui draufgeht dann läuft irgendwas falsch, einfach die fertigen controls drauf und gut ist.
Das kommt aber sicherlich nicht gut rüber. Die Webseite total ansprechend und professionell gestaltet und dann möchtest du als fertiges Produkt die hässlichen WinForm Controls rüberbringen? Sorry aber das ergibt nicht wirklich Sinn. Natürlich steht die Funktionsweise im Vordergrund, allerdings macht das Design eben für den Kunden viel aus. Schließlich könnte es mehrere Programme für den selben Nutzen mit dem selben Funktionsumfang geben. Was meinst du, wonach der Kunde dann wohl entscheidet?

Interne Nutzung (z.B. firmenintern) betrifft das nicht, da stimme ich dir zu das es da kein Design braucht und es nur um reine Funktionalität geht.

Das können wir jetzt hier ewig weiterführen weil wir beide verschiedene Standpunkte vertreten. Darum geht es aber hier primär auch nicht, sondern um den Funktionsumfang den WPF bietet wenn es um dynamische Panels geht.
04/16/2014 14:24 Andreas9#17
Okay, also fassen wir zusammen das gerade wenn es ums Design geht Wpf´s mehr Möglichkeiten bieten. So wie ich es sehe brauche ich aber auch für simple Dinge, wo das Design nicht das primäre Ziel ist, enorm viel Zeit - wenn ich Wpf´s verwende. Natürlich brauche ich immer weniger Zeit, umso mehr ich mich damit beschäftigen würde.

Für den Anfang meiner C# Programme habe ich mich aber entschieden Window Forms zu verwenden und eben jetzt mal mit Panels deren Visible Status ich auf true oder eben false setze.
Ich werde wenn ich die Zeit finde, neben Webdev und den Windows Forms, mich mit Wpf´s mal auseinandersetzen.



Sooo vorerst habe ich aber noch zu den Window Forms eine Frage und zwar habe ich ein Menü und alle meine Panels haben den Visible Wert -> false. Nun klicke ich eben auf den ersten Menüpunkt 1 und alles funktionert - Das Panel wird angezeigt per panelwhatever1.Visible = true.

Jetzt klicke ich den zweiten Menüpunkt an und es passiert nichts.
Ich hatte gehofft, dass nun automatisch das vorherige Panel wieder seinen Startwert false für die Sichtbarkeitswert bekommt - leider ist dem nicht so.
Natürlich ist die Lösung für mich nun gewesen das Panel von Menüpunkt 1 zu verstecken und dann erst das Panel, von Menüpunkt 2, sichtbar zu machen.
Optional kann ich ja noch die Controls clearen, schätze das wäre dann eine Performance Verbesserung - kenne mich wie gesagt noch nicht wircklich aus... .

Die Frage ist nun natürlich wenn ich mehrere Menüs habe wäre es wieder morz aufwendig festzustellen, woher komme ich und welches panel muss ich nun unsichtbar machen... .
Die "Hau drauf!"-Methode wäre alle Panels zu verstecken und dann das gewünschte Panel sichtbar zu machen... .

Kurz und knapp: Existiert da nicht irgendeine andere BESSERE Lösung mit dem diese Sache besser gelöst wird?

#Edit:
Gleich noch ne Frage - Im Visual Studio Designer gibt es keine Möglichkeit einzelne Objekte per Dokumentengliederung auszublenden... . Das heißt ich muss, bei beispielsweise 20 Panels in Form1, 19 Panels aus dem übergeordneten Container abdocken und zur Seite schieben um an das erste Panel zu kommen wo ich dann Window Forms, die sich darauf befinden, verschieben zu können - neue hinzufügen zu können, etc. .
04/16/2014 14:45 Schlüsselbein#18
Erstell die Panels dynamisch, dann hast du das Problem mit dem Designer nicht.
Möglichkeiten gibt es viele für dein Vorhaben. Performance spielt hier aber keine Rolle. Wenn es für dich am einfachsten ist, alle Panels unsichtbar zu machen und dann das gewünschte sichtbar zu machen, dann tu es.

Alternativ die Panels dynamisch erstellen und in einer Liste oder ähnlichen Speichern. Das ganze noch in ne kleine schnucklige Klasse packen, ne Referenz auf das letzte sichtbare Objekt halten und das Ding sollte ein Selbstläufer sein.
04/16/2014 14:58 Andreas9#19
schlüsselbein wäre ich erfahren dann würde ich einen standpunkt haben - den ich vertrete... . Falls du diesen Thread gelesen hast, wurde das mit dem unsichtbar machen vorgeschlagen - Also habe ich es auf diese Weise verwendet... . Deine Antwort ist für mich so hilfreich wie ne Antwort im Webbereich erstell die Webseite repsonsive dann passt se für jede Bildschirmgröße... . Merkste was fehlt? Das wie - welche Möglichkeiten, Beispiele... .

Es wäre nett wenn du auf meine Fragen antwortest und nicht was in den Raum wirfst.
Wenn du deinen Vorschlag besser erläuterst wäre dieser eventuell tatsächlich hilfreich gewesen... . So kann ich nicht wircklich was damit anfangen... . Den Inhalt dynamisch austauschen ist das Ziel - mach´s halt als "hilfreiche" Antwort hilft mir nicht wircklich... .
04/16/2014 15:11 Schlüsselbein#20
Normalerweise reichen diese Stichworte. Auch wenn man aus dem Webbereich kommt, sollte man Suchmaschinen verwenden können, oder nicht?
[Only registered and activated users can see links. Click Here To Register...]

Hier ein unvollständiges Beispiel (allerdings in C++ geschrieben, sollte aber zeigen, was ich meine):
Code:
#include <iostream>
#include <memory>
#include <vector>

struct panel{ bool visible; panel() : visible(false){} }; // panel des framework
class form{};	// form des frameworks
using panel_ptr = std::unique_ptr<panel>;

class panel_manager
{
private:
	std::vector<panel_ptr> panels_;
	form& form_;

	// -1 = errorzustand, letztes sichtbares objekt gelöscht, liste sortiert etc.
	// muss dann noch behandelt werden
	int last_;	

public:
	panel_manager(form& f) : form_(f), last_(-1)
	{

	}

	void new_panel()
	{
		panel_ptr p(new panel());
		// p->set_parent(f)
		// set height, width blabka

		panels_.push_back(std::move(p));	// panel zur liste hinzufügen
	}

	bool set_visible(int index)
	{
		if(index < 0 || index >= panels_.size())
			return false;

		if(last_ != -1)
		{
			panels_[last_]->visible = false;
		}

		panels_[index]->visible = true;
		last_ = index;

		return true;
	}
	
	void print()
	{
		for(auto& p : panels_)
		{
			std::cout << (p->visible ? "True" : "False") << std::endl;
		}
	}
};

int main()
{
	form f;
	panel_manager p(f);

	for(int i = 0; i < 20; ++i)
	{
		p.new_panel();
	}
	p.set_visible(5);
	p.set_visible(7);
	p.set_visible(12);
	p.print();
}
04/24/2014 11:22 Serraniel#21
Hab sowas ähnliches für meine Programme teilweise:
Mach dir auf die Form nen Panel, da wird alles reingeladen immer.

Das was darein geladen wird machst du jeweils ein UserControl für. Das was als erstes darein geladen wird beim Programmstart heißt bei mir z.B. PnlMain. Das Container Panel wo es drin angezeigt wird heißt PnlFrame.

Alle Usercontrols bekommen einen Konstruktor nach dem Beispiel.
Code:
 public partial class PnlMain : UserControl
    {
        FrmMain frm; //FrmMain ist die Form in der ich alles darstelle

 public PnlMain(FrmMain _frm)
        {
            InitializeComponent();
            frm = _frm;
        }
}
Zudem habe ich Buttons in den Usercontrols die den Inhalt wechseln. Sieht dann so aus:
Code:
frm.ChangePanel(new PnlCreateConfig(frm)); //PnlCreateConfig ist ein weiteres UserControl mit selben Konstruktor
In deiner Form brauchst du nun noch die ChangePanel Methode:
Code:
 public void ChangePanel(Control con)
        {
            PnlFrame.Controls.Clear();
            PnlFrame.Controls.Add(con);
        }
Ich hoffe ich hab jetzt nichts vergessen dabei :o :D