Templates für Slider in extra Datei auslagern

  • WPF

Es gibt 14 Antworten in diesem Thema. Der letzte Beitrag () ist von kafffee.

    Templates für Slider in extra Datei auslagern

    Guten Abend,

    ich möchte für meine Slider programmweit einen Style definieren. Ziel ist es, dem Slider selbst (ich glaube das nennt sich Thumb) und der "Schiene", auf der er läuft, eine andere Farbe zuzuweisen. Das ist alles. Sonst nichts :)

    Muss ich da komplett das Slider-Template laden und die entsprechenden Zeilen abändern? Das sind ca. 260 Zeilen. Oder kann man das auch einfacher haben. Und wenn nicht, gibt es wenigstens die Möglichkeit, das komplette Template in eine eigene Datei auszulagern? Ich meine keine Application. xaml sondern eine Datei für genau dieses Steuerelement.

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

    Hallo

    Wie man Styles und Template in eigene Dateien auslagert habe ich dir in deinem letzten Post mit mehreren Style und auch einem Template genau gezeigt, auch mit einem Projekt welches ich hochgeladen habe.
    Hast du es so probiert? Wenn ja, wäre der Code interessant, dann können wir mal sehen warum das nicht funktioniert.

    Das ganze Template brauchst du aber definitiv nicht, wenn du ins Template mal reinschaust siehst du ja sofort welche Styles überschrieben werden müssen um die Funktionalität/die Änderung zu erzielen welche du anstrebst.

    Dann zeigst du uns mal was du hast/probiert hast und wir können dir zeigen was du falsch machst. So bleibt auch der lerneffekt nicht 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. ##

    Nofear23m schrieb:

    Das ganze Template brauchst du aber definitiv nicht, wenn du ins Template mal reinschaust siehst du ja sofort welche Styles überschrieben werden müssen um die Funktionalität/die Änderung zu erzielen welche du anstrebst.


    Genau das war die Hauptfrage. :)

    Also wie greife ich aus meinen Application.Resources auf einzelne Propertys bzw. Styles aus dem Template zu ohne gleich das komplette Template übernehmen zu müssen. Intellisense schlägt mir nämlich nicht alle Propertys aus dem Template vor...
    Im Template selbst hab ich die entsprechenden Zeilen schon ausfindig machen können.
    OK, also ich hab mir das genauer angesehen.

    Leider hat MS für dieses Control keine Überschreibbaren Styles festgelegt. (Was mich jetzt gerade total perplex macht).
    Ich nehme mal an weil fast niemand mehr Slider verwendet, zumindest nicht so wie ein Slider Normalerweise aussieht und sie davon ausgehen das sich eh jeder das Template selbst erstellt. Keine Ahnung.

    Sorry für meine überstürzte Antwort, dann brauchst du doch ein Template. ;(
    Ist aber recht easy:

    Du legst dir ein Resourcefile an in welchem du das Template und die Styles definierst:

    XML-Quellcode

    1. <Style x:Key="SliderRepeatButton" TargetType="RepeatButton">
    2. <Setter Property="SnapsToDevicePixels" Value="true" />
    3. <Setter Property="OverridesDefaultStyle" Value="true" />
    4. <Setter Property="IsTabStop" Value="false" />
    5. <Setter Property="Focusable" Value="false" />
    6. <Setter Property="Template">
    7. <Setter.Value>
    8. <ControlTemplate TargetType="RepeatButton">
    9. <Border BorderThickness="1" BorderBrush="Black" Background="Black" Height="3"/>
    10. </ControlTemplate>
    11. </Setter.Value>
    12. </Setter>
    13. </Style>
    14. <Style x:Key="SliderRepeatButton1" TargetType="RepeatButton">
    15. <Setter Property="SnapsToDevicePixels" Value="true" />
    16. <Setter Property="OverridesDefaultStyle" Value="true" />
    17. <Setter Property="Template">
    18. <Setter.Value>
    19. <ControlTemplate TargetType="RepeatButton">
    20. <Border SnapsToDevicePixels="True" Background="Green" BorderThickness="1" BorderBrush="YellowGreen" Height="3"/>
    21. </ControlTemplate>
    22. </Setter.Value>
    23. </Setter>
    24. </Style>
    25. <Style x:Key="SliderThumb" TargetType="Thumb">
    26. <Setter Property="SnapsToDevicePixels" Value="true" />
    27. <Setter Property="OverridesDefaultStyle" Value="true" />
    28. <Setter Property="Template">
    29. <Setter.Value>
    30. <ControlTemplate TargetType="Thumb">
    31. <Ellipse Height="10" Width="10" Fill="Green"></Ellipse>
    32. </ControlTemplate>
    33. </Setter.Value>
    34. </Setter>
    35. </Style>
    36. <ControlTemplate x:Key="Slider" TargetType="Slider">
    37. <Grid>
    38. <Grid.RowDefinitions>
    39. <RowDefinition Height="Auto" />
    40. <RowDefinition Height="Auto" MinHeight="{TemplateBinding MinHeight}" />
    41. <RowDefinition Height="Auto" />
    42. </Grid.RowDefinitions>
    43. <Track Grid.Row="1" x:Name="PART_Track" >
    44. <Track.DecreaseRepeatButton>
    45. <RepeatButton Style="{StaticResource SliderRepeatButton1}" Command="Slider.DecreaseLarge" />
    46. </Track.DecreaseRepeatButton>
    47. <Track.Thumb>
    48. <Thumb Style="{StaticResource SliderThumb}" />
    49. </Track.Thumb>
    50. <Track.IncreaseRepeatButton>
    51. <RepeatButton Style="{StaticResource SliderRepeatButton}" Command="Slider.IncreaseLarge" />
    52. </Track.IncreaseRepeatButton>
    53. </Track>
    54. </Grid>
    55. </ControlTemplate>
    56. <Style TargetType="Slider">
    57. <Setter Property="Focusable" Value="False"/>
    58. <Setter Property="SnapsToDevicePixels" Value="true" />
    59. <Setter Property="OverridesDefaultStyle" Value="true" />
    60. <Style.Triggers>
    61. <Trigger Property="Orientation" Value="Horizontal">
    62. <Setter Property="MinHeight" Value="21" />
    63. <Setter Property="MinWidth" Value="104" />
    64. <Setter Property="Template" Value="{StaticResource Slider}" />
    65. </Trigger>
    66. </Style.Triggers>
    67. </Style>


    Dann klappt das wunderbar.

    XML-Quellcode

    1. <Slider Minimum="0" Maximum="100" Value="30" Width="200">
    2. </Slider>




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

    kafffee schrieb:

    Wie leg ich das Resourcefile an?


    ????

    Rechtsklick auf den Ordner oder das Projekt wo das File hin soll -> Hinzufügen -> Resourcenverzeichnis

    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

    Sorry nochmal so ne blöde Frage:
    Bei mir heisst das glaube ich nicht "Ressourcenverzeichnis sondern "Ressourcenwörterbuch". Kann das sein? Ich benutze VS 2017...

    Jedenfalls hab ich eine MeinSlider.xaml angelegt, komisch ist, dass diese nicht im Projektmappenexplorer angezeigt wird...

    Und wenn ich sie einbinden will mittels:

    XML-Quellcode

    1. ​<Application.Resources>
    2. <ResourceDictionary>
    3. <ResourceDictionary.MergedDictionaries>
    4. <ResourceDictionary Source="MeinSlider.xaml"/>
    5. </ResourceDictionary.MergedDictionaries>
    6. </ResourceDictionary>
    7. </Application.Resources>


    ...kommt in Zeile 4 der Fehler "Fehler beim Suchen nach Ressourcenverzeichnis "MeinSlider.xaml""...

    kafffee schrieb:

    Bei mir heisst das glaube ich nicht "Ressourcenverzeichnis sondern "Ressourcenwörterbuch".

    Ja, das kann sein. Wenn man in der 2019er mit "Neue Element" hinzufügt ist es auch anders benannt als über das Contextmenü. :huh:

    kafffee schrieb:

    komisch ist, dass diese nicht im Projektmappenexplorer angezeigt wird

    What?? Muss da sein wenn du sie hinzugefügt hast. Aber du hast eh ein ganzes Projekt von mir wo du dir das abschaun kannst.

    Ansonsten mal mal ein schnelles Testprojekt und lade es hoch. Wie soll ich dir so helfen, ich weis weder obs das File nun wirklich gibt oder nicht, noch wie überhaupt deine Projektmappe aussieht.
    z.b. habe ich gerade erfahren das du noch mit der 2017er herumfliegst. Ich persönlich nutze gerne die aktuelle Entwicklungsumgebung.

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

    Alter!

    Dann erstell ihn doch einfach. =O
    Hast du dich mit deiner Entwicklungsumgebung bereits beschäftigt? Hast du meine Videos geschaut?
    Da erkläre ich das alles. Wobei - OK, Ordnererstellung erkläre ich tatsächlich nicht, wenn jemand programmiert gehe ich davon aus das man Ordner erstellen kann, aber evtl. verwirrt viele die Fülle an funktionen die VS bietet.
    Das vergesse ich oft.

    OK, hier ein Video(!!). also dann weis ich auch nicht mehr weiter wie ich es erklären soll.
    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. ##

    @Nofear23m

    Super vielen Dank für das Video. Jetzt klappts (zumindest im Testprojekt).

    Ich versuch das grad in mein Projekt zu integrieren, stosse aber auf diesen Fehler in Zeile 1 in der Application.xaml:
    "Die Resources-Eigenschaft darf nur einmal festgelegt werden."

    XML-Quellcode

    1. <Application.Resources>
    2. <ResourceDictionary Source="/Resources/MeinSlider.xaml"/>
    3. <Color x:Key="Vordergrundfarbe"/>
    4. <SolidColorBrush x:Key="VordergrundfarbeBrush"/>
    5. <SolidColorBrush x:Key="ButtonHighlightFarbe" Color="{DynamicResource Vordergrundfarbe}" Opacity="0.5"/>
    6. <SolidColorBrush x:Key="Transparenz" Color="Transparent"/>
    7. <Style x:Key="meinstil" TargetType="{x:Type Window}">
    8. <Setter Property="WindowState" Value = "Maximized"/>
    9. <Setter Property="Background">
    10. <Setter.Value>
    11. <ImageBrush ImageSource="C:\Users\alpha\Pictures\icons\background\_20210711_165049.JPG" Opacity="0.2"/>
    12. </Setter.Value>
    13. </Setter>
    14. </Style>
    15. [usw...]
    16. </Application.Resources>
    Hallo

    Hör mal, du hast keinen lerneffekt wenn du sofort hier Postest und wir servieren dir die Lösung am Silbertablett. Das bringt dir auf lange sicht nichts. Du musst das ganze verstehen.
    Ich habe in meiner Tutorialreihe ein eigenes Kapitel hierfür wo dies auch erklärt wird. Hast du dir die Videos angesehen. Lernen ist die Devise, nicht kopieren.

    Ich poste jetzt mal nicht einfach die Lösung. Überlege bitte.
    Du hast ein ResourceDictionary eingebunden. Und zwar in ein ResourceDictionary. (Ja, die Application.xaml ist nichts anderes).
    Jetzt aufgepasst.... du musst die Mergen. Und damit hast du jetzt auch schon DAS Schlagwort dafür.

    Ein kurzer Googleaufruf mit "how to style in resourcedictionary" hätte dir als erstes Ergebnis schon das richtige gebracht. Ich glaube in meinem ersten Kapitel der Tutorialreihe habe ich erklärt das für einen Entwickler das wichtigste ist wie man richtig Googelt und wie man sich Infos besorgt und sich somit VIEL Zeit spart.

    Das soll jetzt keine Kritik sein und ich hoffe du bekommst das nicht in den falschen Hals, ich meine es nur gut, es bringt ja DIR nichts, mir könnte es völlig egal sein, ich will DIR helfen das du voran kommst.

    PS: Wenn nur wir beide hier schreiben musst du mich nicht immer markieren.

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

    OK ich habs :thumbsup:

    Dass man das mergen muss, war mir irgendwie klar, aber ich wäre nie drauf gekommen, dass meine definierten Styles untendrunter in der Application.xaml dann genau so viel sind und nichts anderes wie ein MergedDictionary...

    Nach stundenlangem Surfen im Internet kam nichts Sinnvolles bei der Suche raus, weil da hiess es immer nur man muss halt mergen...

    Manchmal kommen mir die besten Ideen, wenn ich den Computer ausmach und mich auf die Couch setze... 8o

    kafffee schrieb:

    wenn ich den Computer ausmach und mich auf die Couch setze

    Das kenne ich. Oft braucht es ein wenig abstand, dann setzt man sich mit "frischem" Kopf hin und plötzlich klappt es.

    Hoffe dir ist klar auf was ich raus will. Es soll ja ein Lerneffekt vorhanden sein.

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

    Ja also zumindest diese Problemstellung hat sich jetzt in meinen Kopf gehämmert. :thumbup: Bevor ich poste versuch ich eigentlich immer mich zu informieren und probier dann auch ne Weile lang rum und wenn das nicht fruchtet poste ich halt. Bloss kommt mir dann wie gesagt manchmal (mitten in der Nacht z.B.) ein Geistesblitz und ich komm selber auf die Lösung...