it-swarm.com.de

Ändern Sie den ausgewählten und nicht fokussierten Listbox-Stil so, dass er nicht ausgegraut ist

Ich habe eine wirklich einfache WPF ListBox mit SelectionMode auf Multiple gesetzt.

<ListBox SelectionMode="Multiple" />

Wenn die ListBox den Fokus verliert, ist es sehr schwer zu sagen, was ausgewählt wurde, da die Auswahlfarbe von blau zu hellgrau wechselt. Wie lässt sich dieses Verhalten am einfachsten so ändern, dass es blau bleibt?

Ich weiß, dass es wahrscheinlich etwas mit dem ListItem-Stil zu tun hat, aber ich kann nicht herausfinden, wo.

Prost.

Ähnlich: WPF ListView Inactive Selection Color

31
Ray

Ich habe in einem zusammengeführten ResourceDictionary Folgendes verwendet:

<Style TargetType="ListBoxItem">
    <Style.Resources>
        <!--SelectedItem with focus-->
        <SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}" Color="LightBlue" Opacity=".4"/>
        <!--SelectedItem without focus-->
        <SolidColorBrush x:Key="{x:Static SystemColors.InactiveSelectionHighlightBrushKey }" Color="LightBlue" Opacity=".4"/>
    </Style.Resources>
</Style>
49
Guy Starbuck

Dies ist keine Antwort auf die Frage, aber ich fand dies, als ich nach einer Möglichkeit suchte, die Auswahl in meinen Listenfeldern zu deaktivieren. Wenn Sie eine leicht modifizierte Form von Guy's & bendewey's Technik verwenden, können Sie Ihrer Listbox scheinbar keine Auswahlen geben, ohne das zugrunde liegende Element-Steuerelement oder ähnliches zu ersetzen. Hier ist der Code, den ich verwendet habe:

<Grid.Resources>
  <Style TargetType="ListBoxItem">
    <Style.Resources>
      <SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}" Color="White" />
      <SolidColorBrush x:Key="{x:Static SystemColors.HighlightTextBrushKey}" Color="Black" />
      <SolidColorBrush x:Key="{x:Static SystemColors.ControlBrushKey}" Color="White" />
    </Style.Resources>
  </Style>
</Grid.Resources>

Ich fand auch die folgende MSDN-Seite hilfreich:

MSDN: SystemColors-Mitglieder (System.Windows)

Danke für die Hilfe, Leute.

11
Eben Geer

Eine vollständigere Lösung wäre, den neuen Pinsel auf HighlightColor verweisen zu lassen:

<Style TargetType="ListBox">
    <Setter Property="ItemContainerStyle">
        <Setter.Value>
            <Style TargetType="ListBoxItem">
                <Style.Resources>
                    <SolidColorBrush x:Key="{x:Static Member=SystemColors.InactiveSelectionHighlightBrushKey}"
                                     Color="{DynamicResource ResourceKey={x:Static Member=SystemColors.HighlightColorKey}}" />
                </Style.Resources>
            </Style>
        </Setter.Value>
    </Setter>
</Style>

Dies würde sicherstellen, dass es dieselbe Farbe verwendet und mit dem Systemdesign übereinstimmt (auch wenn sich das Systemdesign dank DynamicResource zur Laufzeit ändert).

Übrigens scheint es, dass neuere Versionen von WPF hierfür nicht mehr "ControlBrush", sondern "InactiveSelectionHighlightBrush" verwenden.

7
nmclean

Sie können Ihr Problem wahrscheinlich lösen, indem Sie die Vorlage neu schreiben, aber versuchen Sie dies für einen einfachen Patch.

<Style TargetType="ListViewItem">
  <Style.Resources>
    <SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}" Color="Blue" />
    <SolidColorBrush x:Key="{x:Static SystemColors.ControlBrushKey}" Color="Blue" />
  </Style.Resources>
</Style>
4
bendewey

Ich habe auch dieses Problem. Aber ich habe das mit IsSynchronizedWithCurrentItem = "True" gelöst:

<ListBox 
IsSynchronizedWithCurrentItem="True" />
0
ncfuncion

Wenn Ihre ausgewählten Elemente ausgegraut werden, liegt dies daran, dass Ihr Steuerelement seinen logischen Fokus verliert. Mehrere Steuerelemente können gleichzeitig den logischen Fokus haben. Eine einfache Lösung hierfür könnte darin bestehen, Ihrer ListBox über den FocusManager ein FocusScope zu geben.

<ListBox SelectionMode="Multiple" FocusManager.IsFocusScope="True"></ListBox>
0
Sachar