2014-07-24 118 views
0

我有一個正常的ListBox,我想將選擇顏色更改爲紅色。這是迄今爲止我所擁有的。更改列表框的選擇顏色項目

<Style x:Key="myLBStyle" TargetType="{x:Type ListBoxItem}"> 
    <Style.Resources> 
     <SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}" 
         Color="red" /> 
     <SolidColorBrush x:Key="{x:Static SystemColors.InactiveSelectionHighlightBrushKey}" 
         Color="red" /> 
    </Style.Resources> 
</Style> 

它的工作。 SelectedItem是紅色的,即使焦點沒有對準也會保持紅色。

這是我的真正問題:在我的網格中,我也有一個CheckBox,我希望上述樣式僅適用於CheckBox被選中的情況。

因此,如果複選框被選中,我希望選擇顏色爲紅色,如果CheckBox未選中,則選擇藍色(或默認顏色)。

我經歷了網絡,我找不到任何東西,所以我在尋求幫助。

回答

1

你可以有兩個不同的風格 -

  1. 與所有的setter和觸發器的默認樣式。它定義

  2. 空白風格與資源,使這種風格是BasedOn默認樣式,使所有setter和觸發器會從默認的樣式繼承。

然後你就可以換ItemContainerStyle基於複選框選中狀態。


樣品:

<StackPanel> 
    <StackPanel.Resources> 
     <Style x:Key="myLBStyleDefault"> 
      <!-- All setters and triggers go here --> 
     </Style> 
     <Style x:Key="myLBStyleWithRed" 
       BasedOn="{StaticResource myLBBaseStyle}" 
       TargetType="{x:Type ListBoxItem}"> 
      <Style.Resources> 
       <SolidColorBrush 
        x:Key="{x:Static SystemColors.HighlightBrushKey}" 
        Color="Red" /> 
       <SolidColorBrush 
        x:Key="{x:Static SystemColors.InactiveSelectionHighlightBrushKey}" 
        Color="Red" /> 
      </Style.Resources> 
     </Style> 
    </StackPanel.Resources> 
    <CheckBox x:Name="chk"/> 
    <ListBox> 
     <ListBox.Style> 
      <Style TargetType="ListBox"> 
       <Setter Property="ItemContainerStyle" 
         Value="{StaticResource myLBStyleDefault}"/> 
       <Style.Triggers> 
        <DataTrigger Binding="{Binding IsChecked, ElementName=chk}" 
           Value="True"> 
         <Setter Property="ItemContainerStyle" 
           Value="{StaticResource myLBStyleWithRed}"/> 
        </DataTrigger> 
       </Style.Triggers> 
      </Style> 
     </ListBox.Style> 
    </ListBox> 
</StackPanel> 
0

你需要通過處理CheckBox.CheckedCheckBox.Unchecked事件做,在代碼我不相信,你可以添加或使用XAML一個Trigger刪除Resources。但是,properties of the SystemColors class是隻讀的,因此您不能直接設置它們。

有一種方法,我發現,但涉及從user32.dll導入kkk方法,所以它可能不是佯攻心。欲瞭解更多信息,請參閱pinvoke.net網站上的SetSysColors (user32)頁面。從鏈接頁面:

[DllImport("user32.dll", SetLastError=true)] 
public static extern bool SetSysColors(int cElements, int [] lpaElements, int [] lpaRgbValues); 
public const int COLOR_DESKTOP = 1; 

//example color 
System.Drawing.Color sampleColor = System.Drawing.Color.Lime; 

//array of elements to change 
int[] elements = {COLOR_DESKTOP}; 

//array of corresponding colors 
int[] colors = {System.Drawing.ColorTranslator.ToWin32(sampleColor)}; 

//set the desktop color using p/invoke 
SetSysColors(elements.Length, elements, colors); 

//save value in registry so that it will persist 
Microsoft.Win32.RegistryKey key = Microsoft.Win32.Registry.CurrentUser.OpenSubKey("Control Panel\\Colors", true); 
key.SetValue(@"Background", string.Format("{0} {1} {2}", sampleColor.R, sampleColor.G, sampleColor.B)); 
相關問題