2016-06-26 8 views
1

Ich versuche, die visuellen Hinweise, die Auswahl in einem WPF ListBox zeigen, zu verbergen. This answer schlägt vor, dies sollte durch Überschreiben der SystemColors für das ListBox funktionieren.Override SystemColors in lokalen Ressourcen Wörterbuch

ich ein neues WPF-Projekt erstellt und die MainWindow.xaml wie folgt bearbeitet:

<Window x:Class="WpfListboxWithoutSelection.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
     xmlns:local="clr-namespace:WpfListboxWithoutSelection" 
     xmlns:s="clr-namespace:System;assembly=mscorlib" 
     mc:Ignorable="d" 
     Title="MainWindow" Height="150" Width="325"> 
    <Grid> 
    <ListBox> 
     <ListBox.Resources> 
     <SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}" Color="Transparent" /> 
     <SolidColorBrush x:Key="{x:Static SystemColors.HighlightTextBrushKey}" Color="Black" /> 
     <SolidColorBrush x:Key="{x:Static SystemColors.ControlBrushKey}" Color="Transparent" /> 
     </ListBox.Resources> 
     <s:String>Item 1</s:String> 
     <s:String>Item 2</s:String> 
     <s:String>Item 3</s:String> 
    </ListBox> 
    </Grid> 
</Window> 

Leider funktioniert dies nicht, wird das Fenster wie folgt aus:

Jede Idee, was ich mache ich falsch? Wie kann ich die blauen Farben entfernen, die auf dem ausgewählten Objekt und auf dem einen Objekt angezeigt werden?

Antwort

1

Die einzige Möglichkeit, dieses Standardverhalten zu überschreiben, besteht darin, den Standardstil für ListBoxItem zu überschreiben. Ich extrahiere den Standard-Stil aus der Mischung und überschreibe es für deine Bedürfnisse. Hier ist, wie es in meinem Fall getan:

<Window 
    x:Class="WpfApplication2.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
    xmlns:local="clr-namespace:WpfApplication2" 
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
    xmlns:s="clr-namespace:System;assembly=mscorlib" 
    Title="MainWindow" 
    Width="525" 
    Height="350" 
    mc:Ignorable="d"> 

    <Window.Resources> 

     <!-- This is default ListboxItemStyle --> 
     <Style x:Key="ListboxItemControlDefault" TargetType="{x:Type ListBoxItem}"> 
      <Setter Property="Template"> 
       <Setter.Value> 
        <ControlTemplate TargetType="{x:Type ListBoxItem}"> 
         <Border 
          x:Name="Bd" 
          Padding="{TemplateBinding Padding}" 
          Background="{TemplateBinding Background}" 
          BorderBrush="{TemplateBinding BorderBrush}" 
          BorderThickness="{TemplateBinding BorderThickness}" 
          SnapsToDevicePixels="True"> 
          <ContentPresenter 
           HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" 
           VerticalAlignment="{TemplateBinding VerticalContentAlignment}" 
           Content="{TemplateBinding Content}" 
           ContentStringFormat="{TemplateBinding ContentStringFormat}" 
           ContentTemplate="{TemplateBinding ContentTemplate}" 
           SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" /> 
         </Border> 
         <ControlTemplate.Triggers> 
          <MultiTrigger> 
           <MultiTrigger.Conditions> 
            <Condition Property="IsMouseOver" Value="True" /> 
           </MultiTrigger.Conditions> 
           <Setter TargetName="Bd" Property="Background" Value="#1F26A0DA" /> 
           <Setter TargetName="Bd" Property="BorderBrush" Value="#A826A0DA" /> 
          </MultiTrigger> 
          <MultiTrigger> 
           <MultiTrigger.Conditions> 
            <Condition Property="Selector.IsSelectionActive" Value="False" /> 
            <Condition Property="IsSelected" Value="True" /> 
           </MultiTrigger.Conditions> 
           <Setter TargetName="Bd" Property="Background" Value="#3DDADADA" /> 
           <Setter TargetName="Bd" Property="BorderBrush" Value="#FFDADADA" /> 
          </MultiTrigger> 
          <MultiTrigger> 
           <MultiTrigger.Conditions> 
            <Condition Property="Selector.IsSelectionActive" Value="True" /> 
            <Condition Property="IsSelected" Value="True" /> 
           </MultiTrigger.Conditions> 
           <Setter TargetName="Bd" Property="Background" Value="#3D26A0DA" /> 
           <Setter TargetName="Bd" Property="BorderBrush" Value="#FF26A0DA" /> 
          </MultiTrigger> 
          <Trigger Property="IsEnabled" Value="False"> 
           <Setter TargetName="Bd" Property="TextElement.Foreground" Value="{DynamicResource {x:Static SystemColors.GrayTextBrushKey}}" /> 
          </Trigger> 
         </ControlTemplate.Triggers> 
        </ControlTemplate> 
       </Setter.Value> 
      </Setter> 
     </Style> 


     <!-- This is modified ListboxItemStyle --> 
     <Style x:Key="ListboxItemControlModified" TargetType="{x:Type ListBoxItem}"> 
      <Setter Property="Template"> 
       <Setter.Value> 
        <ControlTemplate TargetType="{x:Type ListBoxItem}"> 
         <Border 
          x:Name="Bd" 
          Padding="{TemplateBinding Padding}" 
          Background="{TemplateBinding Background}" 
          BorderBrush="{TemplateBinding BorderBrush}" 
          BorderThickness="{TemplateBinding BorderThickness}" 
          SnapsToDevicePixels="True"> 
          <ContentPresenter 
           HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" 
           VerticalAlignment="{TemplateBinding VerticalContentAlignment}" 
           Content="{TemplateBinding Content}" 
           ContentStringFormat="{TemplateBinding ContentStringFormat}" 
           ContentTemplate="{TemplateBinding ContentTemplate}" 
           SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" /> 
         </Border> 
         <ControlTemplate.Triggers> 
          <MultiTrigger> 
           <MultiTrigger.Conditions> 
            <Condition Property="IsMouseOver" Value="True" /> 
           </MultiTrigger.Conditions> 
           <Setter TargetName="Bd" Property="Background" Value="Transparent" /> 
           <Setter TargetName="Bd" Property="BorderBrush" Value="Transparent" /> 
          </MultiTrigger> 
          <MultiTrigger> 
           <MultiTrigger.Conditions> 
            <Condition Property="Selector.IsSelectionActive" Value="False" /> 
            <Condition Property="IsSelected" Value="True" /> 
           </MultiTrigger.Conditions> 
           <Setter TargetName="Bd" Property="Background" Value="Transparent" /> 
           <Setter TargetName="Bd" Property="BorderBrush" Value="Transparent" /> 
          </MultiTrigger> 
          <MultiTrigger> 
           <MultiTrigger.Conditions> 
            <Condition Property="Selector.IsSelectionActive" Value="True" /> 
            <Condition Property="IsSelected" Value="True" /> 
           </MultiTrigger.Conditions> 
           <Setter TargetName="Bd" Property="Background" Value="Transparent" /> 
           <Setter TargetName="Bd" Property="BorderBrush" Value="Transparent" /> 
          </MultiTrigger> 
          <Trigger Property="IsEnabled" Value="False"> 
           <Setter TargetName="Bd" Property="TextElement.Foreground" Value="{DynamicResource {x:Static SystemColors.GrayTextBrushKey}}" /> 
          </Trigger> 
         </ControlTemplate.Triggers> 
        </ControlTemplate> 
       </Setter.Value> 
      </Setter> 
     </Style> 
    </Window.Resources> 

    <Grid> 
     <ListBox ItemContainerStyle="{StaticResource ListboxItemControlModified}" SelectionChanged="ListBox_SelectionChanged"> 
      <s:String>Item 1</s:String> 
      <s:String>Item 2</s:String> 
      <s:String>Item 3</s:String> 
      <s:String>Item 4</s:String> 
     </ListBox> 
    </Grid> 
</Window> 

Und Sie können immer noch die Elemente auswählen:

private void ListBox_SelectionChanged(object sender, SelectionChangedEventArgs e) 
{ 
    var listBox = sender as ListBox; 

    var selectedItem = listBox.SelectedItem; 
} 

Hoffnung, das hilft.

3

auf jeden Fall wird es nicht funktionieren. Da ListBox.Resources eine Ressource für ListBox nicht für ListBoxItem festlegen wird. Also hier ist eine Lösung:

<Style TargetType="{x:Type ListBoxItem}"> 
    <Setter Property="FocusVisualStyle" Value="{x:Null}" /> 
    <Style.Resources> 
     <SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}" Color="Transparent"/> 
     <SolidColorBrush x:Key="{x:Static SystemColors.InactiveSelectionHighlightBrushKey}" Color="Transparent"/> 
    </Style.Resources> 
</Style> 

diesen Stil Attach in windows.resource wie:

<Window.Resources> 
    <Style TargetType="{x:Type ListBoxItem}"> 
     <Setter Property="FocusVisualStyle" Value="{x:Null}" /> 
     <Style.Resources> 
      <SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}" Color="Transparent"/> 
      <SolidColorBrush x:Key="{x:Static SystemColors.InactiveSelectionHighlightBrushKey}" Color="Transparent"/> 
     </Style.Resources> 
    </Style> 
</Window.Resources> 

Und trotzig können Sie mehr SolidColorBrush in Style.Resources wie setzen, was Sie in Ihrem Code haben.

+0

Aber warum hat [die andere Antwort] (http://stackoverflow.com/a/8975226/377011) 37 upvotes, und jeder sagt, es funktioniert für sie? – cheeesus

+1

Ya Ihre Lösung ist auch richtig, aber manchmal hängt es von der Maschine ab, auch Ihre Lösung arbeitet an meiner Maschine. Ich denke, dass mein Code auf Ihrem Computer funktioniert (es scheint wie Windows 8.1 oder 10). –