Laden...

WPF: Code für mehrere WPF-Fenster wiederverwenden

Erstellt von m.grauber vor 13 Jahren Letzter Beitrag vor 13 Jahren 8.105 Views
M
m.grauber Themenstarter:in
343 Beiträge seit 2010
vor 13 Jahren
WPF: Code für mehrere WPF-Fenster wiederverwenden

Hallo,

wie kann ich bestimmte Methoden und Eigenschaften in C# als "Muster" definieren und dann in beliebigen WPF-Fenstern im XAML-Code zuweisen und im Codebehind nutzen?

So ähnlich würde ich gerne definieren, welches Muster (oder welche Muster) in einer Form verwendet werden sollen:


<Window x:Class="MyProject.Test" : "MyClass.Muster1", "MyClass.Muster2"
...
</Window>

So ähnlich würde ich gerne das Muster definieren:


public class Muster1
{
   public String Tempstring = "";
   public int TempId = 0;

   public void MyWindowClose ()
   {
       this.Close()
   }
}
public class Muster2
{
  public String Tempstring2 = "";
}

Die Muster sollten nicht im Fenster selbst, sondern allgemeingültig in einer Klasse (z. B. MyClass) definiert werden. Im Programmcode müsste trotzdem auf das Fenster verwiesen werden können - siehe: this.Close() - obwohl es dort noch nicht an das Fenster gebunden ist.

Zudem wird durch die Zuweisung von "Muster1" dem Fenster die 3 Member auf einmal zugewiesen.

Ich möchte die Methoden nicht pro Fenster jeweils neu ausprogrammieren müssen, sondern es soll der hinterlegte Code genutzt werden.

Das ganze soll natürlich auch sehr einfach anzuwenden sein 😁

Fällt Euch dazu etwas ein? ?(

Danke und Grüße

Mfg
Michael

PS: Ich stelle nur Fragen, wenn ich in Büchern, im Web und in Foren nichts gefunden habe. Dumme Fragen bitte ich zu entschuldigen!

:] VISUAL STUDIO 2017 + .NET FRAMEWORK 4.5 + SQL-Server 2012 :]

1.044 Beiträge seit 2008
vor 13 Jahren

Hallo m.grauber,

du kannst im Code-Behind von einer Klasse ableiten oder von Window ableiten und dann diese Klasse anstatt Window verwenden.

zero_x

5.742 Beiträge seit 2007
vor 13 Jahren

Hallo m.grauber,

wie kann ich bestimmte Methoden und Eigenschaften in C# als "Muster" definieren und dann in beliebigen WPF-Fenstern im XAML-Code zuweisen und im Codebehind nutzen?

Hmm - wirklich sauber klingt das nicht.
Gerade in der WPF solltest du Logik von der Darstellung trennen, d.h. den Codebehind eines Window möglichst schlank halten.

Baue die Vererbungshierarchie lieber mit ViewModel-Klassen nach.

Wenn es hingegen um UI-bezogene Dinge geht, schaue dir - ja nach Gebiet - ControlTemplates, UserControls und Attached Behaiviors an.

5.657 Beiträge seit 2006
vor 13 Jahren

Fällt Euch dazu etwas ein? ?(

Ja, MVVM.

Weeks of programming can save you hours of planning

M
m.grauber Themenstarter:in
343 Beiträge seit 2010
vor 13 Jahren

Hallo Zero_x,

unter WPF kann man von fast allen UIElementen ableiten, jedoch unter anderem nicht von einem WPF Window. (Man kann aber scheinbar nur den Umweg über ein Control machen)

Aber selbst wenn das klappen würde, könnte ich nur von einem Parent vererben, da WPF nur ein Parent unterstützt. Ich hätte aber gerne mehrere (teils gemischte) "Parents".

Mfg
Michael

PS: Ich stelle nur Fragen, wenn ich in Büchern, im Web und in Foren nichts gefunden habe. Dumme Fragen bitte ich zu entschuldigen!

:] VISUAL STUDIO 2017 + .NET FRAMEWORK 4.5 + SQL-Server 2012 :]

M
m.grauber Themenstarter:in
343 Beiträge seit 2010
vor 13 Jahren

Hallo Mr. Sparkle,

ich weiß, MVVM wird mich sicher mein ganzes Leben "verfolgen" 😭 aber hilft mir in diesem Fall wahrscheinlich auch nichts.

Zumal ich dieses erste, kleinere Programm nicht dafür komplett umbauen möchte.

Die Funktionalität hat in diesem Fall nichts mit den Daten zu tun, sondern mit Features, die ich bestimmten Fenstern vergeben möchte. Somit könnte ich in 2 verschiedenen Fenstern die gleiche Datenbasis bearbeiten, aber in nur 1 Fenster davon hätte ich gerne eine bestimmte Funktionalität hinterlegt.

Mfg
Michael

PS: Ich stelle nur Fragen, wenn ich in Büchern, im Web und in Foren nichts gefunden habe. Dumme Fragen bitte ich zu entschuldigen!

:] VISUAL STUDIO 2017 + .NET FRAMEWORK 4.5 + SQL-Server 2012 :]

5.657 Beiträge seit 2006
vor 13 Jahren

Was meinst du denn eigentlich mit "Muster". Oben sieht es aus, als redest du von Vererbung, aber was du schreibst ist alles ziemlich verwirrend... 🤔

Weeks of programming can save you hours of planning

W
955 Beiträge seit 2010
vor 13 Jahren

dann mach doch verschiedene Controls die diese verschiedenen Features kapseln und weise sie den Forms zu. Beispielsweise hat jedes Windows ein Bedienpanel-WrapPanel und Du hängst dort die versch. Controls rein die benötigt werden (Ein zus.gesetztes Control welche die befehle zum Bearbeiten kapselt, ein Control für Druckbefehle, ...)

M
m.grauber Themenstarter:in
343 Beiträge seit 2010
vor 13 Jahren

Hallo Mr. Sparkle,

also nochmals einfach:

in einem Fenster möchte ich, wenn ich im XAML-Code auf "Muster1" verweise, die Klassenmember von "Muster1" in meiner WPF-Form haben:


public class Muster1
{
   public String Tempstring = "";
   public int TempId = 0;
}

D.h. wenn ich in WPFForm1 auf "Muster1" verweise und in WPFForm2 auch, will ich in beiden Forms Tempstring und TempId haben und diese sollen unabhängig voneinander geändert werden können.

Wie kann das einfach realisiert werden?

Danke

Mfg
Michael

PS: Ich stelle nur Fragen, wenn ich in Büchern, im Web und in Foren nichts gefunden habe. Dumme Fragen bitte ich zu entschuldigen!

:] VISUAL STUDIO 2017 + .NET FRAMEWORK 4.5 + SQL-Server 2012 :]

5.657 Beiträge seit 2006
vor 13 Jahren

Hallo m.grauber,

genau für diesen Zweck gibt es ja DataBinding. Wenn du die Daten von Muster1 anzeigen lassen möchtest, bindest du dein Control an eine Instanz von Muster1, und wenn du Muster2 anzeigen willst, mußt du an eine Instanz von Muster2 binden, usw.

Wenn sich die Art der Darstellung auch unterscheidet, benötigst du außerdem unterschiedliche Controls, wie witte bereits angemerkt hat. Dafür kannst du dann Vererbung benutzen, damit du die relevanten Code-Teile nicht mehrmals schreiben mußt.

Christian

Weeks of programming can save you hours of planning

M
m.grauber Themenstarter:in
343 Beiträge seit 2010
vor 13 Jahren

Hallo Mr. Sparkle,

danke für die Antwort! Ich habe mich vielleicht falsch ausgedrückt:

Wie gesagt, hat es an dieser Stelle nichts mit den Daten zu tun, sondern es handelt sich um die reine Funktionalität in Fenstern.

Muster1 und Muster2 sind KEINE Tabellen etc., sondern beinhalten nur ein oder mehrere Member, die mir zur Form notwendige Werte zwischenspeichern sollen. Sie werden nicht in Datenbanken gesichert und sind wirklich nur für das Fensterhandling gedacht. Ich möchte sie auch nicht per Binding ändern, sondern direkt im C# Programmcode darauf zugreifen.

z. B. "Muster1" = "EinfachesFensterMuster":
int FensterID = 0;

z. B. "Muster2" = "KomplexesFensterMuster":
bool FensterSchliessenErlaubt = true;
int FensterAutomatischZuNach = 0;
int FensterAnzeigebereich = 0;

Wenn ich also im XAML-Code angebe, dass "EinfachesFensterMuster" verwendet werden soll, möchte ich den Member FensterID im Codebehind automatisch haben. Wenn ich "KomplexesFensterMuster" angebe, sollen dessen 3 Member im Codebehind automatisch vorhanden sein.

Theoretisch könnte ich auch beide Muster angeben, was mir 4 Member verfügbar macht. Die Member sollen direkt auf Fensterebene verfügbar sein.

Ich hoffe, es ist nun besser beschrieben.

Grüße

Mfg
Michael

PS: Ich stelle nur Fragen, wenn ich in Büchern, im Web und in Foren nichts gefunden habe. Dumme Fragen bitte ich zu entschuldigen!

:] VISUAL STUDIO 2017 + .NET FRAMEWORK 4.5 + SQL-Server 2012 :]

M
m.grauber Themenstarter:in
343 Beiträge seit 2010
vor 13 Jahren

Hallo winsharp93,

das ich Dir als letztes Antworte hat den Grund, dass Du mir die meisten Themen vorgegeben hast, mit denen ich mich seither beschäftige.

Hmm - wirklich sauber klingt das nicht.
Gerade in der WPF solltest du Logik von der Darstellung trennen, d.h. den Codebehind eines Window möglichst schlank halten.

--> Möchte ich auch schlank halten. Es soll nur fensterspezifisches hinein

Baue die Vererbungshierarchie lieber mit ViewModel-Klassen nach.

--> Mehrschichtig möchte ich vorerst nicht und hier handelt es sich wie gesagt NICHT um Daten, die in Tabellen gespeichert werden sollen.

Wenn es hingegen um UI-bezogene Dinge geht, schaue dir - ja nach Gebiet - ControlTemplates, UserControls und Attached Behaiviors an.

--> Jawohl, damit beschäftige ich mich jetzt einige Zeit und habe mir alles etwas angesehen.

Attached Behaviors ist sehr komplex und passt nicht richtig.

UserControls - dann müsste ich in jede Form ein "unsichtbares" Usercontrol mit meinen gewünschten Members setzen? - Dort muss ich dann immer über das auf meiner Form integrierte Usercontrol arbeiten? Und ich müsste mir in jeder Form überlegen, an welche Stelle ich den Inhalt hineinsetzen darf.

ControlTemplates klingt passend: Nur das Problem ist folgendes. Wenn ich im Template versuche zu definieren:


<Style TargetType="Window">
  ...
  <Setter Property="MeineProperty" Value="0"></Setter>
  ...
</Style>

geht das nicht, da er diese Property nicht findet. Zudem ist es fraglich, ob ich auf diese Property dann auch im Codebehind zugreifen könnte.

Grüße

Mfg
Michael

PS: Ich stelle nur Fragen, wenn ich in Büchern, im Web und in Foren nichts gefunden habe. Dumme Fragen bitte ich zu entschuldigen!

:] VISUAL STUDIO 2017 + .NET FRAMEWORK 4.5 + SQL-Server 2012 :]

5.657 Beiträge seit 2006
vor 13 Jahren

ControlTemplates klingt passend: Nur das Problem ist folgendes. Wenn ich im Template versuche zu definieren:

  
<Style TargetType="Window">  
  ...  
  <Setter Property="MeineProperty" Value="0"></Setter>  
  ...  
</Style>  
  

geht das nicht, da er diese Property nicht findet.

Was daran liegt, daß die Klasse Window kein Property namens MeineProperty hat. Du mußt also als TargetType die entsprechende Klasse einsetzen. Steht aber alles in der Doku.

Christian

Weeks of programming can save you hours of planning

M
m.grauber Themenstarter:in
343 Beiträge seit 2010
vor 13 Jahren

Hallo Mr. Sparkle,

vielen Dank. Ich möchte ja in der Klasse "Window" eine neue Property "MeineProperty" anlegen, daher ist auch "Window" angegeben.

Alle "Windows" denen dieses Template zugewiesen wird, sollen "MeineProperty" haben und ich will auf "MeineProperty" dann auch im CodeBehind zugreifen.

Scheinbar ist dies aber trotzdem der falsche Weg. 🤔

Grüße

Mfg
Michael

PS: Ich stelle nur Fragen, wenn ich in Büchern, im Web und in Foren nichts gefunden habe. Dumme Fragen bitte ich zu entschuldigen!

:] VISUAL STUDIO 2017 + .NET FRAMEWORK 4.5 + SQL-Server 2012 :]

5.657 Beiträge seit 2006
vor 13 Jahren

Auf jeden Fall der falsche Weg. Wenn du einer Klasse eine weitere Eigenschaft zuweisen möchtest, mußt du eine eigene Klasse davon ableiten. Das sind die absoluten Grundlagen der Objektorientierten Programmierung!

Weeks of programming can save you hours of planning

M
m.grauber Themenstarter:in
343 Beiträge seit 2010
vor 13 Jahren

Hallo Mr. Sparkle,

dass weiß ich schon, Aber da genau beißt sich die Katze in den Schwanz:

  1. eine WPF-Form kann nicht abgeleitet werden

  2. ich möchte gerne mehrere "Ableitungen" haben

Also lautet die Antwort: es geht nicht?

Grüße

Mfg
Michael

PS: Ich stelle nur Fragen, wenn ich in Büchern, im Web und in Foren nichts gefunden habe. Dumme Fragen bitte ich zu entschuldigen!

:] VISUAL STUDIO 2017 + .NET FRAMEWORK 4.5 + SQL-Server 2012 :]

5.657 Beiträge seit 2006
vor 13 Jahren

Doch, sicher kannst du von einem WPF-Window oder Steuerelement ableiten. Es geht nur nicht für Klassen mit XAML-Definition. Aber das macht nichts, du kannst dir deine Gerüste in reinem Code bauen, und in den zuletzt abgeleiteten Klassen kannst du eine XAML-Datei mit den Steuerelementen hinzufügen.

Aber meiner Meinung nach wird es erst so kompliziert, weil du dich beharrlich weigerst, deine Programmlogik von der Benutzeroberfläche zu trennen. Du willst es schnell und einfach, aber wie du siehst, ist das der eigentlich beschwerliche Weg.

Christian

Weeks of programming can save you hours of planning

M
m.grauber Themenstarter:in
343 Beiträge seit 2010
vor 13 Jahren

Hallo Mr. Sparkle,

Es geht nur nicht für Klassen mit XAML-Definition.

--> Also für ein XAML-WPF-Fenster geht es nicht.

Aber das macht nichts, du kannst dir deine Gerüste in reinem Code bauen,...

--> Ja eine Klasse

... und in den zuletzt abgeleiteten Klassen kannst du eine XAML-Datei mit den Steuerelementen hinzufügen.

--> das verstehe ich nicht? Wie binde ich die Klasse an das XAML-Fenster? 🤔

Danke

Mfg
Michael

PS: Ich stelle nur Fragen, wenn ich in Büchern, im Web und in Foren nichts gefunden habe. Dumme Fragen bitte ich zu entschuldigen!

:] VISUAL STUDIO 2017 + .NET FRAMEWORK 4.5 + SQL-Server 2012 :]

5.657 Beiträge seit 2006
vor 13 Jahren

Was genau verstehst du da nicht? Es geht um Vererbung von anderen Klassen...
Siehe auch hier: http://geekswithblogs.net/lbugnion/archive/2007/03/02/107747.aspx

Weeks of programming can save you hours of planning

5.742 Beiträge seit 2007
vor 13 Jahren

Es geht nicht?

Genau!
Der Grund ist einfach: Das macht keinen Sinn.
Andere Wege wurden ja schon genannt.