Listbox markierte Elemente sollen auch bei Fokusverlust sichtbar bleiben.

  • WPF

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

    Listbox markierte Elemente sollen auch bei Fokusverlust sichtbar bleiben.

    Erstmal Frohes Neues Jahr,

    In meinem Programm gibt es eine Liste, in der man Einträge auswählen kann. Jetzt möchte ich, dass diese Markierungen sichtbar bleiben, auch wenn die Liste keinen Focus mehr hat. Ich möchte nicht, dass die dann ausgegraut und schlecht erkennbar sind.

    Hat jemand eine Idee?

    Gruß
    Tobias
    If she IsNot here then sunshine = false
    Hallo

    Kannst du mal einen Screenshot machen, ich kann das problem nicht nachvollziehen.


    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

    Danke für den Screenshot.

    Du kannst den Style von ListBoxItem überschreiben. So hast du volle Kontrolle

    Beispiel:

    XML-Quellcode

    1. <Grid>
    2. <StackPanel>
    3. <StackPanel.Resources>
    4. <SolidColorBrush x:Key="Item.MouseOver.Background" Color="#1F26A0DA"/>
    5. <SolidColorBrush x:Key="Item.MouseOver.Border" Color="#a826A0Da"/>
    6. <SolidColorBrush x:Key="Item.SelectedInactive.Background" Color="#3D26A0DA"/>
    7. <SolidColorBrush x:Key="Item.SelectedInactive.Border" Color="#FFDADADA"/>
    8. <SolidColorBrush x:Key="Item.SelectedActive.Background" Color="#3D26A0DA"/>
    9. <SolidColorBrush x:Key="Item.SelectedActive.Border" Color="#FF26A0DA"/>
    10. <Style TargetType="{x:Type ListBoxItem}">
    11. <Setter Property="Template">
    12. <Setter.Value>
    13. <ControlTemplate TargetType="{x:Type ListBoxItem}">
    14. <Border x:Name="Bd" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" Padding="{TemplateBinding Padding}" SnapsToDevicePixels="true">
    15. <ContentPresenter HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/>
    16. </Border>
    17. <ControlTemplate.Triggers>
    18. <MultiTrigger>
    19. <MultiTrigger.Conditions>
    20. <Condition Property="IsMouseOver" Value="True"/>
    21. </MultiTrigger.Conditions>
    22. <Setter Property="Background" TargetName="Bd" Value="{StaticResource Item.MouseOver.Background}"/>
    23. <Setter Property="BorderBrush" TargetName="Bd" Value="{StaticResource Item.MouseOver.Border}"/>
    24. </MultiTrigger>
    25. <MultiTrigger>
    26. <MultiTrigger.Conditions>
    27. <Condition Property="Selector.IsSelectionActive" Value="False"/>
    28. <Condition Property="IsSelected" Value="True"/>
    29. </MultiTrigger.Conditions>
    30. <Setter Property="Background" TargetName="Bd" Value="{StaticResource Item.SelectedInactive.Background}"/>
    31. <Setter Property="BorderBrush" TargetName="Bd" Value="{StaticResource Item.SelectedInactive.Border}"/>
    32. </MultiTrigger>
    33. <MultiTrigger>
    34. <MultiTrigger.Conditions>
    35. <Condition Property="Selector.IsSelectionActive" Value="True"/>
    36. <Condition Property="IsSelected" Value="True"/>
    37. </MultiTrigger.Conditions>
    38. <Setter Property="Background" TargetName="Bd" Value="{StaticResource Item.SelectedActive.Background}"/>
    39. <Setter Property="BorderBrush" TargetName="Bd" Value="{StaticResource Item.SelectedActive.Border}"/>
    40. </MultiTrigger>
    41. <Trigger Property="IsEnabled" Value="False">
    42. <Setter Property="TextElement.Foreground" TargetName="Bd" Value="{DynamicResource {x:Static SystemColors.GrayTextBrushKey}}"/>
    43. </Trigger>
    44. </ControlTemplate.Triggers>
    45. </ControlTemplate>
    46. </Setter.Value>
    47. </Setter>
    48. </Style>
    49. </StackPanel.Resources>
    50. <ListBox Height="100" Margin="10">
    51. <ListBoxItem Content="Item 1"/>
    52. <ListBoxItem Content="Item 2"/>
    53. <ListBoxItem Content="Item 3"/>
    54. <ListBoxItem Content="Item 4"/>
    55. <ListBoxItem Content="Item 5"/>
    56. </ListBox>
    57. <ListBox Height="100" Margin="10">
    58. <ListBoxItem Content="Item 1"/>
    59. <ListBoxItem Content="Item 2"/>
    60. <ListBoxItem Content="Item 3"/>
    61. <ListBoxItem Content="Item 4"/>
    62. <ListBoxItem Content="Item 5"/>
    63. </ListBox>
    64. </StackPanel>
    65. </Grid>


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

    Das mittm Template im Style ist schon ziemlich hoch aufgehängt und evtl. nicht unheikel. Das tauscht die gesamte Standard-Oberfläche des Controls aus. Da hat man schnell das eine oder annere Feature übersehen, und zum andern, wenn man unter ein anneres Theme gerät, passt sich die selbstgebastelte Listbox diesem nicht mehr an.

    Niedriger aufgehängt wäre vlt. ein Style, der einfach die System-InactiveSelectionColor umstellt, dasse aussieht wie die HighlightColor.
    gugge Resources + Systemfarben

    Hat auch Nebeneffekte, weil innerhalb der Listbox ist dann eben die System-InactiveSelectionColor verdreht für alle eingeschachtelten Controls.
    Aber wenns eine einfache Listbox sein soll, ohne gross Eingeschachteltes KlickiBunti - wie sagt man in der Medizin: "Der weniger invasive Eingriff" ;)

    ErfinderDesRades schrieb:

    Das tauscht die gesamte Standard-Oberfläche des Controls aus

    Ne, nicht das Control. Nur ListBoxItem (!!), nicht Listbox.

    ErfinderDesRades schrieb:

    Niedriger aufgehängt wäre vlt. ein Style, der einfach die System-InactiveSelectionColor umstellt

    Wäre interessant, denke aber. Das Template was ich gepostet habe ist das Originale von MS. Wo nur die Farbe von mir getauscht wurde.
    Auch wenn man das theme ändert, bleibt alles arhalten. Wenn man Inactivecolor nicht sehen will will man es in einem anderen Theme ja auch nicht sehen. Alles andere wie z.b. Activecolor bleibt erhalten.
    Dadurch das MS hier in den Resourcen des ListboxItem folgendes setzt: <SolidColorBrush x:Key="Item.SelectedInactive.Background" Color="#3D26A0DA"/> und sich nicht auf die Systemcolor stützt (seh dir das Original-Template an) wird das hier denke ich auch nicht gehen. Deshalb habe ich es so gemacht. Aber gerne lerne ich dazu.

    Kannst du ein Beispiel machen?

    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:

    Ne, nicht das Control. Nur ListBoxItem (!!), nicht Listbox.
    ups - da habich falsch geguckt.
    "Nur" ListboxItem zu vertrullern ist natürlich wesentlich weniger bedenklich.

    Nofear23m schrieb:

    Kannst du ein Beispiel machen?

    XML-Quellcode

    1. <Style TargetType="{x:Type ListBoxItem}">
    2. <Style.Resources>
    3. <SolidColorBrush x:Key="{x:Static SystemColors.InactiveSelectionHighlightBrushKey}" Color="{x:Static SystemColors.HighlightColor}" />
    4. <SolidColorBrush x:Key="{x:Static SystemColors.InactiveSelectionHighlightTextBrushKey}" Color="{x:Static SystemColors.HighlightTextColor}"/>
    5. </Style.Resources>
    6. </Style>
    Jetzt sieht die inaktive Selection genau so aus wie die aktive System-Selection.
    (Verändert man nu die SystemSelection, passts wieder nicht zusammen. Kann man glaub auch noch lösen, aber ich bin grad bisserl denkfaul)

    ErfinderDesRades schrieb:

    "Nur" ListboxItem zu vertrullern ist natürlich wesentlich weniger bedenklich.

    Ein Template zu überschreiben ist bei dir "vertrulern"? Achja. Wilkommen in der WPF.

    ErfinderDesRades schrieb:

    Jetzt sieht die inaktive Selection genau so aus wie die aktive System-Selection.

    Wenn funktionieren würde sicher. Hast du es versucht? Wird auch vom Designer unterwellt. The member "InactiveSelectionHighlightBrushKey" is not recognized or is not accessible.

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

    Müsste ja so auch gehen. Aber bitte. Uppe mal. Wäre ja cool wenns so ginge.

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

    Darin die rechte Listbox deren Items haben nu die Selection-SystemFarben, wenn sie selektiert sind, der Focus aber nicht auf der Listbox liegt.

    (Liegt der Focus drauf, greift mein Listviewitemstyle, und die HighlightBackColor ist Khaki)
    Dateien
    @ErfinderDesRades
    Ist das sicher das richtige Projekt?
    Da ist leider weder etwas Khaki, noch bleibt die SelektionColor. ?(


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

    ups - was ich eingebaut hab, hab ich gleich wieder auskommentiert.
    also such diese passage im MainWindow:

    XML-Quellcode

    1. <!--<ItemsControl.ItemContainerStyle>
    2. <Style TargetType="{x:Type ListBoxItem}">
    3. <Style.Resources>
    4. <SolidColorBrush x:Key="{x:Static SystemColors.InactiveSelectionHighlightBrushKey}" Color="{x:Static SystemColors.HighlightColor}" />
    5. <SolidColorBrush x:Key="{x:Static SystemColors.InactiveSelectionHighlightTextBrushKey}" Color="{x:Static SystemColors.HighlightTextColor}"/>
    6. </Style.Resources>
    7. </Style>
    8. </ItemsControl.ItemContainerStyle>-->
    und kommentier das ein.
    Hallo

    Auskommentierung aufgehoben
    Leider ohne erfolg -> siehe Screenshot
    Ich denke wir drehen uns leicht im Kreis. Warum es bei dir funzt verstehe ich nicht. Hier geht das nicht. Getestet auf 2 verschiedenen Rechnern.


    Welches OS und welche Version hast du?

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

    Vieleicht ist hier der Unterschied. Ich kann es leider nicht probieren. Habe keinen Rechner mehr mit Win7, selbst in der Firma haben wir bereits alle 83 Clients umgestellt. Kann es nicht mehr probieren. ||

    So, damit wir das abschliessen können (vieleicht Hilft es ja jemanden unter Win7) Poste doch bitte einen Screenshot unter Win7.

    Schöne 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. ##


    Designtime.WithoutItemContainerStyle - man sieht das inactive SelectedItem: schwarze Schrift auf grau


    Designtime.WithItemContainerStyle - das inactive SelectedItem ist jetzt nicht mehr grau, sondern in Systemfarben highlighted: weiß auf Dunkelblau



    Zur Laufzeit sieht man zusätzlich - in der linken kleinen Listbox - meinen Khaki - Highlight-Style, den ich per ResourceDictionary inne App.Xaml eingebunden hab.

    Runtime.WithoutItemContainerStyle


    Runtime.WithItemContainerStyle

    Wie gesagt: Es ist das MainWindow der Solution von Resources + Systemfarben

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

    ErfinderDesRades schrieb:

    n der Runtime sieht man auch meinen Khaki-Highlight-Brushkey, nämlich in der kleinen Listbox links

    Ja, aber leider unter Win8/Win10 nicht. Auch die rechte Listbox bleibt nicht blau.
    Ich werde es aber sicher noch unter Win7 probieren, das interessiert mich jetzt.

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

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