Support, Anregungen, Wünsche zur Tutorialreihe <WPF lernen/>

  • WPF MVVM

Es gibt 448 Antworten in diesem Thema. Der letzte Beitrag () ist von Nofear23m.

    Hallo @EaranMaleasi

    Klar, man muss immer SEINEN besten Weg finden. Je nach Anwendungfall und was man benötigt. Ich müsste ja auch nicht immer die DB befragen, aber wie du ja richtig sagst kann ich inkrementell nachladen.
    Man muss immer von Fall zu Fall unterscheiden. Dennoch macht es keinen Sinn 10.000 Elemente anzuzeigen wenn ich nur eines benötige. Das ist meine Meinung. Ob jetzt trotzdem alle geladen werden und es wird lokal selektiert oder über eine DB muss man dann entscheiden aber ich finde es echt unnötig in ein DataGrid so viele Datensätze zu laden, muss aber jeder für sich entscheiden.

    Wir haben beim Porsche eine DMS Applikation welche die Kundensuche genau so macht wie ich es beschrieben habe und ich war selbst mehr als überrascht wie schnell das "Handzuhaben" ist. Ich hätte es auch nicht gedacht ... bis ich es selbst ausprobiert habe. Ich war mehr als Überrascht. ich finde aus mehreren hunderttausend Kunden mich selbst in 3 Sekunden. Und das über die WAN Leitung da die Datenbank in Salzburg läuft. Ich darf es nicht zeigen (Video oder Screenshot), müsste man mal nachbauen mit ein paar verschiedenen Varianten und sehen was besser ist, wobei Benutzerführung und UI immer auch ein Stück ein Subjektiver Eindruck ist.

    Grüße
    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. ##

    MichaHo schrieb:

    Was ist wenn ich 10.000 Elemente habe? ist das dann nicht Ressourcen fressend? Bzw. Dauert das Filtern dann nicht ewig? Gibt es da nicht etwas schnelleres?
    Ich glaube, es ist egal - denn die Auflistung muss sowieso völlig durchlaufen werden und dabei jeweils eine Überprüfung der angegeben Attribute erfolgen.
    Z.B. in LINQ bei einer WHERE-Klausel und da beim Filter (ist eigentlich eh nichts anderes).
    Beim Sortieren muss auch die Auflistung völlig durchlaufen und die Elemente zu einander verglichen werden...
    Hallo Leute

    Wieder ein Teil Online.
    2.1.4.7 Validierung von Benutzereingaben
    Hier der direktlink: Tutorialreihe <WPF lernen/>

    @EaranMaleasi
    Ich habe nun den Ton mit Audacity aufgenommen und "gesäubert". Leider habe ich dann gemerkt das ich das Micro noch zu nah hatte aber was haltest du sonst nun davon??
    Auch mit der PowerPoint und der Einleitung sowie beim Schnitt habe ich mir jetzt ein wenig mehr mühe gegeben.

    PS: Das Video ist leider ab ende der Einleitung fehlerhaft, mein Schnittprogramm hat mir da irgendwas falsch gespeichert. Ich erstelle es gerade neu und lade es dann nochmals hoch. Sorry dafür.
    Ich tausche dann die Links gleich noch aus.

    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

    Das neu transcodierte Video ist nun auf YT hochgeladen und die Links im Thread korrigiert.

    Sorry für die umstände.

    @EaranMaleasi
    Das freut mich :) . Ich nehme Kritik gerne an um das ganze zu verbessern. Wenn ich mir die Arbeit schon mache solls auch gut werden.
    Immerhin dauert ein Kapitel mit nem 30 Minuten Video sicher an die 6 Stunden. Überlegen was man genau macht, Beispielprojekt erstellen, Text schreiben, Screenshots machen, Video aufnehmen, Video schneiden, Video hochladen, Forumsbeitrag schreiben. Da hängt schon was dran, da muss es auch halbwegs informativ sein.
    Wichtig ist mir, das man nicht einschläft wenn man versucht sich das auf der Couch am Tablet anzusehen. =O

    @VB1963 , da gebe ich dir recht. Linq macht im Grunde nichts anderes. Ich hatte bisher auch noch nicht den Fall des es mal richtig langsam wurde aber ich hatte auch noch nicht so viele Datensätze geladen.

    Grüße euch allen
    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. ##

    Nofear23m schrieb:

    2.1.4.7 Validierung von Benutzereingaben

    Vielen Dank für die Fortführung des Werkes! :thumbsup:

    Musste in der car-Klasse hier

    VB.NET-Quellcode

    1. If Marke.Length < 3 Then valRet.Add(New ValidationResult($"'{NameOf(Marke)}' muss aus mindestens 2 Zeichen bestehen!", New List(Of String) From {NameOf(Marke)}))

    nicht < 2 stehen? Mich hat dazu der letzte Screenshot etwas irritiert. ;)
    Hallo

    prinzip schrieb:

    Musste in der car-Klasse hier

    Das hast du völlig recht. war ein Typo. Im Video ist es mir auch aufgefallen und habe ich ausgebessert. Werde es im Beitrag auch gleich nochmal ausbessern. Gut aufgepasst :thumbsup:

    Es freut mich das "man" doch aufmerksam liest.
    Falls irgendjemand Fragen hat, bitte scheut euch nicht.

    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,
    ich probiere mich gerade mit Styles und Triggern.
    Da ich einen Button mit abgerundeten Ecken wollte habe ich dazu ein ControlTemplate hergenommen.
    Das sieht bisher wie folgt aus.
    Spoiler anzeigen

    XML-Quellcode

    1. ​ <Style x:Key="RoundedButton" TargetType="{x:Type Button}">
    2. <Setter Property="Background" Value="LightBlue"/>
    3. <Setter Property="BorderBrush" Value="DarkSlateGray"/>
    4. <Setter Property="BorderThickness" Value="1"/>
    5. <Setter Property="Margin" Value="2"/>
    6. <Setter Property="Padding" Value="3"/>
    7. <Setter Property="Template">
    8. <Setter.Value>
    9. <ControlTemplate TargetType="{x:Type Button}">
    10. <Border CornerRadius="5" Background="{TemplateBinding Background}" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Padding="{TemplateBinding Padding}">
    11. <ContentPresenter HorizontalAlignment="center" VerticalAlignment="Center"/>
    12. </Border>
    13. </ControlTemplate>
    14. </Setter.Value>
    15. </Setter>
    16. <Style.Triggers>
    17. <Trigger Property="IsMouseOver" Value="True">
    18. <Setter Property="Background" Value="LightCoral"/>
    19. </Trigger>
    20. <Trigger Property="IsPressed" Value="True">
    21. <Setter Property="Background" Value="Yellow"/>
    22. </Trigger>
    23. </Style.Triggers>
    24. </Style>


    Ist ist meine Frage, warum werden mir die Trigger Propertys IsPressed , IsMouseOver nicht im Intellisense angezeigt?
    Ein Grund wird sein das sie in verschiedenen NameSpaces liegen, aber ist das auch der Hauptgrund?
    In UIElements denke ich liegen die Propertys die jedes Control hat, in ButtonBase halt noch zusätzlich die für den Button. Oder liege ich hier auch falsch?
    Kann man das irgendwie bewerkstelligen, oder muss man immer im Objectbrowser nachsehen was für Propertys in diesem Falle verfügbar sind?
    Rechtschreibfehler betonen den künstlerischen Charakter des Autors.
    Hallo @Akanel

    Akanel schrieb:

    Ist ist meine Frage, warum werden mir die Trigger Propertys IsPressed , IsMouseOver nicht im Intellisense angezeigt?


    Das funktioniert leider nicht. Aber das tut es nicht nur mit den Buttonstates sondern mit allen Properties innerhalb des Triggers. Intellisense funktioniert leider nur innerhalb der Setter.
    Hier muss man wirklich entweder den Objektkatalog oder MSDN zur Hand nehmen.

    TIPP: Nimm dir wie im Tutorial erklärt das originale Template her und lass dir eine Kopie anlegen. So bekommst du eine sehr gute Vorlage eines Templates.

    PS: Der ReSharper kann es auch hier siehe Anhang

    Grüße
    Sascha
    Bilder
    • Intellisense.PNG

      23,2 kB, 561×347, 95 mal angesehen
    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. ##

    Das mit der Vorlage kam mir auch schon in den Sinn, aber da sind meist nur die 4 gängigsten Propertys bei. Also IsPressed, IsMousever, IsEnabled, IsFocused.
    Was es dann noch für Möglichkeiten gibt, sehe ich da auch nicht.
    Nun gut, dann bemühe ich weiterhin den Objectbrowser oder die Doku.

    Den Resharper habe ich nicht, allerdings habe ich eben nachgelesen was es ist.
    Sicherlich eine Hilfreiche Extension für VisualStudio, allerdings für mich als absoluter Anfänger und dazu noch Hobbyprogrammierer, zu teuer.
    Vielleicht lohnt es sich später, wenn ich brauchbare komplexere Programme schreiben kann.
    Danke Dir.
    Rechtschreibfehler betonen den künstlerischen Charakter des Autors.
    Ich habe da gleich nochmal eine Frage.
    Was genau ist der Unterschied zwischen <ControlTemplate.Triggers> und <Style.Triggers> ?
    Beim erstellen eines Styles für eine Textbox ist mir aufgefallen das bei folgendem Code nur die ForeGround Property übernommen wird, der Background aber in diesem Fall Blau bleibt.

    Spoiler anzeigen

    XML-Quellcode

    1. ​<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    2. xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    3. xmlns:local="clr-namespace:Adressbuch">
    4. <Style x:Key="{x:Type TextBox}" TargetType="{x:Type TextBoxBase}">
    5. <Setter Property="SnapsToDevicePixels" Value="True"/>
    6. <!--<Setter Property="OverridesDefaultStyle" Value="True"/>-->
    7. <!--<Setter Property="KeyboardNavigation.TabNavigation" Value="None"/>-->
    8. <!--<Setter Property="FocusVisualStyle" Value="{x:Null}"/>-->
    9. <Setter Property="MinWidth" Value="120"/>
    10. <Setter Property="MinHeight" Value="20"/>
    11. <!--<Setter Property="AllowDrop" Value="true"/>-->
    12. <Setter Property="Template">
    13. <Setter.Value>
    14. <ControlTemplate TargetType="{x:Type TextBoxBase}">
    15. <Border
    16. Name="Border"
    17. CornerRadius="2"
    18. Padding="2"
    19. Background="Blue"
    20. BorderBrush="Black"
    21. BorderThickness="1" >
    22. <ScrollViewer Margin="0" "/>
    23. </Border>
    24. <!--<ControlTemplate.Triggers>
    25. <Trigger Property="IsEnabled" Value="True">
    26. <Setter Property="Background" Value="Red"/>
    27. <Setter Property="Foreground" Value="White"/>
    28. </Trigger>
    29. </ControlTemplate.Triggers>-->
    30. </ControlTemplate>
    31. </Setter.Value>
    32. </Setter>
    33. <Style.Triggers>
    34. <Trigger Property="IsEnabled" Value="true">
    35. <Setter Property="Background" Value="Red"/>
    36. <Setter Property="Foreground" Value="White"/>
    37. </Trigger>
    38. </Style.Triggers>
    39. </Style>
    40. </ResourceDictionary>



    Und wieso brauch man hier statt einem ContentPresenter einen ScrollViewer? Mit Contetpresenter bekomme ich nichts angezeigt wenn ich eine Textbox mit

    XML-Quellcode

    1. ​<Textbox text="Suchbegriff eingeben"/>
    erstelle.
    Rechtschreibfehler betonen den künstlerischen Charakter des Autors.
    Hallo @Akanel

    Akanel schrieb:

    Was genau ist der Unterschied zwischen <ControlTemplate.Triggers> und <Style.Triggers> ?

    Innerhalb des Setters des ControlTemplate Property kann kein Style.Trigger verwendet werden. Man befindet sich ja auch nicht direkt innerhalb des Styles sondern im ControlTemplate also muss man es dieser Auflistung hinzufügen. Ausserhalb des ControlTemplates kann wieder nur Style.Trigger verwendet werden.



    Akanel schrieb:

    Beim erstellen eines Styles für eine Textbox ist mir aufgefallen das bei folgendem Code nur die ForeGround Property übernommen wird, der Background aber in diesem Fall Blau bleibt.

    Akanel schrieb:

    Und wieso brauch man hier statt einem ContentPresenter einen ScrollViewer? Mit Contetpresenter bekomme ich nichts angezeigt

    Das eigentliche Control wird dann innerhalb des ScrollViewers gerendert. Im Original hat dieser auch den Namen "PART_ContentHost" voran man dies gut erkennen kann. Zum Verständniss: Dies ist so erstellt weil die TestBox ja auch mehrzeilig sein kann und dann müssen Scrollbars kommen wenn der Text länger/höher/mehrzeiliger ist. Du verstehst? Es gibt ja das DependencyProperty TextWrapping.

    So sollte also das Style aussehen damit das klappt:

    XML-Quellcode

    1. <Setter Property="SnapsToDevicePixels" Value="True"/>
    2. <Setter Property="OverridesDefaultStyle" Value="True"/>
    3. <Setter Property="KeyboardNavigation.TabNavigation" Value="None"/>
    4. <Setter Property="FocusVisualStyle" Value="{x:Null}"/>
    5. <Setter Property="MinWidth" Value="120"/>
    6. <Setter Property="MinHeight" Value="20"/>
    7. <Setter Property="Foreground" Value="White"/>
    8. <!--<Setter Property="AllowDrop" Value="true"/>-->
    9. <Setter Property="Template">
    10. <Setter.Value>
    11. <ControlTemplate TargetType="{x:Type TextBox}">
    12. <Border
    13. Name="Border"
    14. CornerRadius="2"
    15. Padding="2"
    16. Background="Blue"
    17. BorderBrush="Black"
    18. BorderThickness="1" >
    19. <ScrollViewer x:Name="PART_ContentHost" Margin="0" />
    20. </Border>
    21. </ControlTemplate>
    22. </Setter.Value>
    23. </Setter>
    24. <Style.Triggers>
    25. <Trigger Property="IsEnabled" Value="true">
    26. <Setter Property="Background" Value="Red"/>
    27. <Setter Property="Foreground" Value="White"/>
    28. </Trigger>
    29. </Style.Triggers>
    30. </Style>


    Ich hoffe das war verständlich. Wenn du noch fragen hast zögere nur nicht.

    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. ##

    Nofear23m schrieb:

    Innerhalb des Setters des ControlTemplate Property kann kein Style.Trigger verwendet werden. Man befindet sich ja auch nicht direkt innerhalb des Styles sondern im ControlTemplate also muss man es dieser Auflistung hinzufügen. Ausserhalb des ControlTemplates kann wieder nur Style.Trigger verwendet werden.


    Ok, das habe ich verstanden.

    Nach einigen Test habe ich auch herausgefunden das man beides gleichzeitig nutzen KANN, aber NICHT MUSS, je nach dem was man machen möchte.

    Einige Sachen gehen eben nicht in <Style.Triggers> dafür aber in <ControlTemplate.Triggers>

    Nofear23m schrieb:

    Das eigentliche Control wird dann innerhalb des ScrollViewers gerendert. Im Original hat dieser auch den Namen "PART_ContentHost" voran man dies gut erkennen kann. Zum Verständniss: Dies ist so erstellt weil die TestBox ja auch mehrzeilig sein kann und dann müssen Scrollbars kommen wenn der Text länger/höher/mehrzeiliger ist. Du verstehst? Es gibt ja das DependencyProperty TextWrapping.


    Auch geschnallt.
    Danke Dir vielmals.
    Rechtschreibfehler betonen den künstlerischen Charakter des Autors.
    Hallo @Nofear23m
    zum Ende des Jahres muss ich doch noch einmal auf mein OSI Programm kommen.
    Ich habe ein Context Menü um Einträge zu löschen, funktioniert auch soweit.
    Jedoch wenn ich ReloadData() aufrufe ist der gelöschte Eintrag wieder da.
    Im OSI Workspace habe ich einen neuen Command hinzugefügt:

    C#-Quellcode

    1. private ICommand _removeInstructionCommand;
    2. public ICommand RemoveInstructionCommand
    3. {
    4. get { return _removeInstructionCommand ?? new RelayCommand(RemoveInstructionCommand_Execute, RemoveInstructionCommand_CanExecute); }
    5. set { _removeInstructionCommand = value; RaisePropertyChanged(); }
    6. }
    7. private bool RemoveInstructionCommand_CanExecute(object obj)
    8. {
    9. return MainWs != null && MainWs.IsInEditMode && AvailableInstructionView.CurrentItem != null;
    10. }
    11. private void RemoveInstructionCommand_Execute(object obj)
    12. {
    13. Instruction instruction = (Instruction)AvailableInstructionView.CurrentItem;
    14. if (MessageBox.Show("Really Delete?", "Delete", MessageBoxButton.YesNo, MessageBoxImage.Question) == MessageBoxResult.Yes)
    15. AvailableInstructions.Remove(instruction);
    16. }

    Setze ich Haltepunkte und steppe dort hin, entfernt er auch die Instruction. Steppe ich weiter, hat er beim Speichern aber wieder die vorher gelöschte mit drin...
    Wo hab ich denn da nen Fehler?
    Ich hänge das Projekt mal mit dran...
    Danke Dir
    Dateien
    "Hier könnte Ihre Werbung stehen..."
    Hallo @MichaHo

    Ich habe mir die Solution jetzt nicht angesehen da ich im Moment nicht die möglichkeit dazu habe aber ich denke ich weis wo der Fehler liegt.

    Du nimmt die Daten ja nur aus der Collectionview heraus. Die CollectionView bringt dir aber nicht viel, diese zeigt ja nur das an wes in der eigendlichen Collection vorhanden ist.
    Du ladest die Daten ja von wo, und dort musst du diese auch löschen.
    Hast du ne DB dahinter musst du die Daten in der DB löschen. Hast du ne XML musst du diese dort löschen.

    Zwei möglichkeiten:

    Entweder den Datensatz löschen und dann ein Reload() oder du löscht den Datensatz und nimmst es gleichzeitig aus der Auflistung heraus ohne Reload()
    Letzteres ist hald performanter da nicht alles neu geladen werden muss.

    Falls du auf keinen "grünen zweig" kommst müsste ich mir die Solution am Abend mal ansehen. So, muss jetzt mal mein Auto Reparieren gehen. X/

    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 @MichaHo

    Bist du hier weitergekommen, ist mir irgendiwe untergegangen :S

    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. ##

    Achso, ok.

    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. ##

    Hi @Nofear23m
    ich ackere gerade noch einmal deine Videos zu den Styles durch und hab mir auch das Video zu den Namespaces und den Beitrag zu den Resourcen durch.

    Nun hab ich mir eine Solution erstellt, in der ich gerne alle UserControls, Styles, Templates und Trigger erstellen möchte, damit ich dies als DLL in andere Projekte einbinden kann.
    Jetzt bin ich mal hergegangen und hab analog zu deinem Namespace Video, in der AssemblyInfo die Xmlns Prefix und Definition hinzugefügt.
    In meinem Testprojekt (gleiche Solution) hab ich die Verweise gesetzt und Versuchte dann in der App.xaml die Resourcen einzubinden.

    Das scheitert, weil er den Namespace nicht findet.

    Kannst Du nochmal erklären, wie man dies genau einbindet?

    Ich hänge hier mal paar Bilder an, falls Du die Solution benötogtst, sag Bescheid.

    Danke Dir
    "Hier könnte Ihre Werbung stehen..."