UserControl vererben oder / und überarbeiten

  • WPF

Es gibt 9 Antworten in diesem Thema. Der letzte Beitrag () ist von Johannes.

    UserControl vererben oder / und überarbeiten

    Hallo an alle, die mir bei meinem Problem helfen wollen
    und an alle andern, denen dieser Thread helfen sollte.

    1. Kann ich in der WPF ein UserControl (oder UserWindow) vererben?
    (ist sicher schon zig mal erklärt, aber ich habe bisher nur die Anwort gefunden: "Nein" bzw. nur eine Code-Klasse vom Typ UserControl kann ich vererben, das XAML nicht)

    2. Alle Controls der WPF lassen sich wunderbar erweitern und anpassen, einer Schaltfläche kann ich z.B. ein Image aufdrücken oder mit einem Grid oder StackPanel die unglaublichsten Eigenschaften zuweisen.
    Wie kann ich eigene UserControls so entwickeln, dass ich zu einem späteren Zeitpunkt ähnliche Erweiterungen "erfinden" kann.

    Beispiel: ich entwickle ein allgemeines DBForm welches alle Eigenschaften zur Datenbankkommunikation bekommt.
    Entweder durch Vererbung oder durch Anpassung bekommt DBForm1 die Datenfelder für Personendaten, DBForm2 Veranstaltungsdaten und DBForm3 z.B. Fundraising-Daten
    Egal, das Beispiel könnte ich unendlich fortsetzen.

    Danke für alle Tipps und Hinweise oder Links zu den entsprechenden Tutorials!
    Hallo

    Die kurze Antwort. Das geht nicht.

    Die längere Antwort: Zum einen kannst du ein CustomControl (nicht UserControl) erstellen und bist da später frei in Sachen gestalltung. Wie bei einem Button, hier kannst du ein eigenes Template "einpflanzen".
    Sowas kannst du auch selbst machen. Du gibst ein Template an und der Anwender (in dem Fall vermutlich du) kann sich ein eigenes Template dafür bauen.
    Zum anderen kannst du Überall und na belieben einen "Platzhalter" im Control einbauen. Ist dieser von Typ Content kannst du dort alles reinpacken. Ja, auch Controls.

    Nimm ein Label. Ein Label hat die Eigenschaft Content. Diese ist vom Typ Object. Das ist der Grund warum du in ein Label einen Button knallen kannst. Macht keinen Sinn, aber es geht.
    Hast du in deinem UserControl oder CustomControl eine solche Eigenschaft kannst du das auch machen, somit bist du in der Lage zu "verschachteln".

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    Hallo miteinander,
    evtl. Sascha?

    so einfach war es (für mich) dann doch nicht.


    ich habe ein UserControl dbForm erstellt, links den Datensatzmarkierer und unten die typischen Schaltflächen

    XML-Quellcode

    1. <UserControl ....
    2. <DockPanel LastChildFill="True">
    3. <local:jwDAOButtonBar DockPanel.Dock="Bottom" Height="30" />
    4. <Button x:Name="btnRecordSelector" DockPanel.Dock="Left" Width="25" Margin="1,2,1,2" Content=">" VerticalContentAlignment="Top"/>
    5. <ContentControl x:Name="WinData">
    6. <Grid/>
    7. </ContentControl>
    8. </DockPanel>
    9. </UserControl>


    Also eigentlich nichts besonderes.

    Wenn ich dieses UserControl (kein Benutzerdefiniertes Control)
    in ein neues Fenster einbinde, dann sieht das zunächst genauso aus wie erwartet.

    Wenn ich jetzt aber versuche, in das leere ContentControl (so hatte ich das verstanden) etwas einzufügen, dann verschwinden alle bisherigen Schaltflächen


    XML-Quellcode

    1. <Window x:Class="Test" ....
    2. <DockPanel LastChildFill="True">
    3. <local:jwDAOForm x:Name="FormButtos">
    4. <Label Content="Hallo Welt"/>
    5. </local:jwDAOForm>
    6. </DockPanel>
    7. </Window>


    Könnt ihr mir einen Tipp geben, wo der Fehler liegt?

    Vielen Dank!

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Johannes“ ()

    Hallo

    Sorry. Bei deinen erklärungen kann ich echt nicht folgen. Evtl. bin ich zu dumm aber ich kann Anhand dessen was du Postest einfach nicht nachvollziehen was nun wo genau sein soll/nicht passiert wie es soll.

    Wie setzt du den Content des ContentControl z.b.?
    Das sehe ich da nicht heraus.

    Tipp: Wenn du sowas "angehst", mach das immer mit einem kleinen Beispiel wo du einfach irgendein Control reinpackst. z.b. ein Label mit Beschriftungen wie "Content1", "Content2" oder "Parent" sowie "Child". Wenn dann was nicht funktioniert wie gewollte kannst du ganz einfach dieses Beispiel nehmen und hier mit uns Teilen und jeder kann es nachvollziehen.

    Ich sehe hier auch kein Binding auf das Content-Property des Contentcontrol, ich weis also nicht wie du den content festlegst. Hoffentlich nicht per CodeBehind.

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    ControlsUndWeiter.7z

    OK, ich hoffe damit kannst du mehr anfangen.

    Das Beispiel hat praktisch noch keinen Code, hier geht es nur "ums Stapeln".

    dbButtonBar hat ein paar Schaltflächen, dbForm hat links einen Button und unten die ButtonBar
    Und in MainWindow würde ich gern dbForm einbinden und dann Label, Textboxen etc. einbinden.
    Das geht vielleicht auch im Overlay (wie bei deinem SliderButton der Kreis über dem Oval) aber
    da garantiert mir niemand, das ein Control "über den Rand" rutscht.

    Kann ja sein, dass ich das völlig falsch anfange, doch da muss man eben auch erst mal drauf kommen X(

    Liebe Grüße
    Johannes
    Hallo Johannes

    Erstmal hast du in dem Beispiel einige Bindingfehler was man auch in der Ausgabe super sieht.

    Quellcode

    1. System.Windows.Data Error: 4 : Cannot find source for binding with reference 'ElementName=jwDAOScrollConnectorPanel'. BindingExpression:Path=ActualHeight; DataItem=null; target element is 'Button' (Name='btnFirst'); target property is 'Width' (type 'Double')
    2. System.Windows.Data Error: 4 : Cannot find source for binding with reference 'ElementName=jwDAOScrollConnectorPanel'. BindingExpression:Path=ActualHeight; DataItem=null; target element is 'Button' (Name='btnPrevious'); target property is 'Width' (type 'Double')
    3. System.Windows.Data Error: 4 : Cannot find source for binding with reference 'ElementName=jwDAOScrollConnectorPanel'. BindingExpression:Path=ActualHeight; DataItem=null; target element is 'TextBox' (Name='tbDSPosition'); target property is 'Height' (type 'Double')
    4. System.Windows.Data Error: 4 : Cannot find source for binding with reference 'ElementName=jwDAOScrollConnectorPanel'. BindingExpression:Path=ActualHeight; DataItem=null; target element is 'Button' (Name='btnNext'); target property is 'Width' (type 'Double')
    5. System.Windows.Data Error: 4 : Cannot find source for binding with reference 'ElementName=jwDAOScrollConnectorPanel'. BindingExpression:Path=ActualHeight; DataItem=null; target element is 'Button' (Name='btnLast'); target property is 'Width' (type 'Double')
    6. System.Windows.Data Error: 4 : Cannot find source for binding with reference 'ElementName=jwDAOScrollConnectorPanel'. BindingExpression:Path=ActualHeight; DataItem=null; target element is 'Button' (Name='btnNew'); target property is 'Width' (type 'Double')
    7. System.Windows.Data Error: 4 : Cannot find source for binding with reference 'ElementName=jwDAOScrollConnectorPanel'. BindingExpression:Path=ActualHeight; DataItem=null; target element is 'Button' (Name='btnDelete'); target property is 'Width' (type 'Double')
    8. System.Windows.Data Error: 4 : Cannot find source for binding with reference 'ElementName=jwDAOScrollConnectorPanel'. BindingExpression:Path=ActualHeight; DataItem=null; target element is 'TextBox' (Name='tbRecCount'); target property is 'Height' (type 'Double')
    9. System.Windows.Data Error: 4 : Cannot find source for binding with reference 'ElementName=jwDAOScrollConnectorPanel'. BindingExpression:Path=ActualHeight; DataItem=null; target element is 'TextBox' (Name='tbRecKey'); target property is 'Height' (type 'Double')
    10. System.Windows.Data Error: 4 : Cannot find source for binding with reference 'ElementName=jwDAOScrollConnectorPanel'. BindingExpression:Path=ActualHeight; DataItem=null; target element is 'Button' (Name='btnCancelEdit'); target property is 'Width' (type 'Double')


    Schau immer das Bindingfehler so gut als möglich NICHT vorhanden sind.

    Gut, gehen wir weiter:

    Du hast Content nirgens gesetzt. Weder als Binding noch im Code. Du erwartest also das ich das für dich mache. In der Art. "Ich probiers nicht mal, der macht mir das schon". Jetzt weis ich auch warum du das nicht gepostest hast. Weil du es erst garnicht drinnen hattest. Da bin ich nun etwas entäuscht. Anfang sah es so aus als wolltest du was lernen. Aber gut. Du hast ja z.b. schon gelernt wie man DependencyProperties erstellt und diese dann Bindet, weis es hier aber nicht anzuwenden. Im Grund ist das wonach du hier Fragst genau das was wir schon in einem früheren thread hatten wenn ich jetzt nicht irre.

    Das einzige ist dann per DataTemplates die richtigen Controls rendern zu lassen. Aber das Thema habe ich auch in meinem Tutorial ausführlich drinnen.
    Aber... das was du gerade Fragst ist für das was du da vorhast nur der erste Tropfen, da kommt noch sehr viel auf dich zu. Gerade mit der verschachtelung mit deiner Navigation unten welche sich wieder in einem UserControl befindet. Von aussen muss man dann Daten reicheichen können und die Navigation soll am besten automatisch gehen. Da ich weis das du hier bis du in die nähe eines Ziels kommst noch sicher zig mal fragen wirst kürze ich das mal zumindest ein wenig ab und hab dir hier zum einen dein Problem "behoben" als auch rusimentäre Funktionen wie Datensatzindex, Count, Next-Button, Previous-Button der Navigation implementiert. Natürlich nicht perfekt, nur damit du einen Anhaltspunkt hast.

    Da werden sicher einige Fragen von deiner Seite kommen aber ich denke das ist einfacher als wenn du 30 Threads aufmachen musst.

    Grüße
    Sascha
    Dateien
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    Hallo Sascha,
    Entschuldige! Ich wollte mich jetzt nicht auf die faule Haut legen "Der macht das schon!"

    Den Code für die Schaltflächen, Datensatz und Editmode, das hatte ich alles rausgeschmissen um nur das wesentliche Problem darzustellen.

    Ich hatte bei meinem grafischen Ansatz hier noch nicht an Datenbindung gedacht und bin da wohl noch in der "WinForm-Denkweise": Basisklasse > Vererbung > Vererbung > Vererbung
    Dass der Content ein Property benötigt und dort von innen und von außen über Binding gearbeitet werden muss, und mit DataTemplates, sorry das hatte ich hier nicht auf dem Schirm, ich wollte ja noch keine Daten verarbeiten, sondern nur ein paar grafische Elemente positionieren.

    Also noch einmal zurück zu den Grundlagen und Üben!

    Vielen Dank! Auch für deine Geduld!

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Johannes“ ()

    Hallo Johannes

    Johannes schrieb:

    Den Code für die Schaltflächen, Datensatz und Editmode, das hatte ich alles rausgeschmissen um nur das wesentliche Problem darzustellen.

    Jetzt machst du mich aber neugierig. Du hast dies bereits funktionsbereit? Das würde mich brennend interessieren. Wenn du das selbst hinbekommen hast ziehe ich meinen Hut. Respekt.

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    Hallo Sascha,

    "Das würde mich brennend interessieren"

    Das kann ich mir eigentlich nicht vorstellen. Bis jetzt bin ich ja vollständig im Experimentiermodus, von "Schönheit" kann gleich gar nicht die Rede sein.
    Bisher habe ich auch alles mit klassischen Button-Click-Methoden implementiert. Viel Schöner ist es natürlich mit den Commands.
    Da muss ich nicht zu Fuß alle Schaltflächen ein und aus schalten, weil das die CommandInterfaceklasse im Hintergrund erledigt.
    Das ist also auf jeden Fall ein Punkt, den ich einarbeiten muss.

    Du wirst sagen "Da bekomme ich ja Augenkrebs."
    Aber dieses Projekt hat eher den Status eines "Schmierzettels" als einer wirklichen Anwendung.
    Ich versuche mir zunächst so etwas wie einen "Werkzeugkasten" zu basteln, bevor ich eine echte Anwendung in Angriff nehme.

    Aber trotzdem vielen Dank für alle Deine Bemühungen.
    Johannes
    Dateien
    • DB7.7z

      (367,83 kB, 47 mal heruntergeladen, zuletzt: )