2013-05-29 5 views
16

मैं सिस्टम रंग के बजाए एक चयनित ListBoxItem के पृष्ठभूमि रंग को सेट करने का प्रयास कर रहा हूं। मैंने पढ़ा है कि मैं यहां एसओ पर क्या पा सकता हूं और पीछा किया है, या माना जाता है कि वहां सिफारिशों का पालन किया गया है (Change background color for selected ListBox item, WPF How to change the listbox selected item text color when the list box loses focus, Change selected and unfocused Listbox style to not be grayed out, और अन्य)।पृष्ठभूमि रंग या WPF सेट करना (4.0) ListBox - विंडोज 8

सभी चयनित आइटम के लिए हाइलाइटब्रश और कंट्रोलब्रश को पारदर्शी पर सेट करके समस्या को हल करने लगते हैं। मेरे पास निम्न XAML है और यह फ़ॉन्ट रंग को ठीक से सेट करता है, लेकिन बैकग्राउंड ब्रश सेटिंग्स के बावजूद डिफ़ॉल्ट पारदर्शी नीला है। मैं अभी भी एक डब्ल्यूपीएफ नोब का थोड़ा सा हूं, इसलिए मुझे यहां कुछ आसान याद आना चाहिए।

<ListBox Width="Auto" Height="Auto" Grid.Column="0" BorderThickness="0" Background="#FFF3F3F3" xmlns:sys="clr-namespace:System;assembly=mscorlib"> 
    <ListBox.ItemsSource> 
     <x:Array Type="{x:Type sys:String}"> 
      <sys:String>String 1</sys:String> 
      <sys:String>String 2</sys:String> 
      <sys:String>String 3</sys:String> 
      <sys:String>String 4</sys:String> 
     </x:Array> 
    </ListBox.ItemsSource> 
    <ListBox.ItemContainerStyle> 
     <Style TargetType="ListBoxItem" BasedOn="{StaticResource {x:Type ListBoxItem}}"> 
      <Style.Resources> 
      <SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}" Color="Transparent" /> 
      <SolidColorBrush x:Key="{x:Static SystemColors.ControlBrushKey}" Color="Transparent" /> 
      </Style.Resources> 
      <Setter Property="HorizontalContentAlignment" Value="Stretch" /> 
      <Setter Property="FontSize" Value="16"/> 
      <Setter Property="Foreground" Value="#999999"/> 
      <Style.Triggers> 
      <Trigger Property="IsSelected" Value="True" > 
       <Setter Property="Background" Value="White" /> 
       <Setter Property="Foreground" Value="Black" /> 
      </Trigger> 
      </Style.Triggers> 
     </Style> 
    </ListBox.ItemContainerStyle> 
    <ListBox.ItemTemplate> 
     <DataTemplate> 
      <TextBlock Text="{Binding}" HorizontalAlignment="Right" Margin="0,0,8,0" Background="Transparent"/> 
     </DataTemplate> 
    </ListBox.ItemTemplate> 
</ListBox> 

मैं सही दिशा में किसी भी nudges की सराहना करता हूं।

संपादित:

पहला उत्तर है कि यह एक मामूली बदलाव के साथ उनके लिए काम किया पढ़ने के बाद, मैं अनुप्रयोग है कि मैं अपने Windows 8 मशीन पर विकसित किया गया है ले लिया और एक विंडोज 7 वी एम में यह मार डाला और यह उम्मीद के रूप में काम किया। विंडोज 8 मशीन के साथ-साथ विंडोज 7 पर काम करने के लिए इसे बदलने के लिए क्या जरूरत है इस पर कोई विचार?

उत्तर

39

उन पदों विंडोज 8 के लिए पुरानी हो रहे हैं।

कुछ कारणों से विंडोज -8 में माइक्रोसॉफ्ट नहीं चाहता कि लोग अपने डिफ़ॉल्ट Style इतनी आसानी से संपादित करें या Brush ओवर-राइड के साथ कुछ संपादित करें।

ListBoxItem डिफ़ॉल्ट Style वी.एस. से चयन के लिए इस से चलाता है:

चयन राज्य नहीं रह गया है के लिए
<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> 

ट्रिगर ब्रश हम से अधिक की सवारी कर सकते हैं आसानी से लागू करने, लेकिन स्थिर रंग हैं कर रहे हैं। इसलिए इसे संशोधित करने के लिए आपको टेम्पलेट प्राप्त करने और वहां ट्रिगर को संशोधित करने की आवश्यकता होगी।

<MultiTrigger> 
    <MultiTrigger.Conditions> 
    <Condition Property="Selector.IsSelectionActive" 
       Value="False" /> 
    <Condition Property="IsSelected" 
       Value="True" /> 
    </MultiTrigger.Conditions> 
    <Setter TargetName="Bd" 
      Property="Background" 
      Value="White" /> 
    <Setter TargetName="Bd" 
      Property="BorderBrush" 
      Value="White" /> 
</MultiTrigger> 
<MultiTrigger> 
    <MultiTrigger.Conditions> 
    <Condition Property="Selector.IsSelectionActive" 
       Value="True" /> 
    <Condition Property="IsSelected" 
       Value="True" /> 
    </MultiTrigger.Conditions> 
    <Setter TargetName="Bd" 
      Property="Background" 
      Value="White" /> 
    <Setter TargetName="Bd" 
      Property="BorderBrush" 
      Value="White" /> 
</MultiTrigger> 

आपकी समस्या का हल कर दिया जाना चाहिए: White

को यह VS2012 विंडोज -8 द्वारा दिए गए पूर्ण शैली के लिए ListBoxItem

<Style x:Key="ListBoxItemStyle1" 
     TargetType="{x:Type ListBoxItem}"> 
    <Setter Property="SnapsToDevicePixels" 
      Value="True" /> 
    <Setter Property="Padding" 
      Value="4,1" /> 
    <Setter Property="HorizontalContentAlignment" 
      Value="{Binding HorizontalContentAlignment, 
          RelativeSource={RelativeSource FindAncestor, 
                 AncestorLevel=1, 
                 AncestorType={x:Type ItemsControl}}}" /> 
    <Setter Property="VerticalContentAlignment" 
      Value="{Binding VerticalContentAlignment, 
          RelativeSource={RelativeSource FindAncestor, 
                 AncestorLevel=1, 
                 AncestorType={x:Type ItemsControl}}}" /> 
    <Setter Property="Background" 
      Value="Transparent" /> 
    <Setter Property="BorderBrush" 
      Value="Transparent" /> 
    <Setter Property="BorderThickness" 
      Value="1" /> 
    <Setter Property="FocusVisualStyle"> 
    <Setter.Value> 
     <Style> 
     <Setter Property="Control.Template"> 
      <Setter.Value> 
      <ControlTemplate> 
       <Rectangle Margin="2" 
         SnapsToDevicePixels="True" 
         Stroke="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}" 
         StrokeDashArray="1 2" 
         StrokeThickness="1" /> 
      </ControlTemplate> 
      </Setter.Value> 
     </Setter> 
     </Style> 
    </Setter.Value> 
    </Setter> 
    <Setter Property="Template"> 
    <Setter.Value> 
     <ControlTemplate TargetType="{x:Type ListBoxItem}"> 
     <Border x:Name="Bd" 
       Background="{TemplateBinding Background}" 
       BorderBrush="{TemplateBinding BorderBrush}" 
       BorderThickness="{TemplateBinding BorderThickness}" 
       Padding="{TemplateBinding Padding}" 
       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> 

यदि आप करने के लिए उन चलाता संशोधित है।

+0

बहुत बहुत धन्यवाद। मुझे टेम्पलेट्स से ओवरराइड करने के लिए कुछ शोध करने दें और सुनिश्चित करें कि यह काम करता है, क्योंकि मुझे यकीन है कि यह होगा, और इसे उत्तर के रूप में चिह्नित करेगा। –

+1

@RobGoodwin आपका स्वागत है। स्टाइल ओवरराइड देखने के लिए आप https://www.dropbox.com/s/4ni0dbcgzji5h8n/ListBoxSelectionWin8.rar से अपने प्रश्न के लिए एक साथ नमूना डाउनलोड कर सकते हैं। – Viv

+0

यह काम किया। नमूना पोस्ट करने के लिए समय लेने के लिए धन्यवाद। इसने मुझे विंडोज 7 और 8 पर जल्दी परीक्षण करने की इजाजत दी। और यह मुझे WPF नियंत्रणों को स्टाइल करने के बारे में सीखने के लिए कुछ और स्रोत प्रदान करता है। –

0

तो क्या आप बस चयनित आइटम की पृष्ठभूमि को सफेद बनाना चाहते हैं?

आपका कोड शून्य से ControlBrushKey मेरे लिए काम करता है की स्थापना:

<Style.Resources> 
<SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}" Color="White" /> 
</Style.Resources> 
+0

दिलचस्प है, तो यह पढ़ने के बाद मैं एक विंडोज 7 बॉक्स करने के लिए अपने आवेदन ले लिया और यह उम्मीद के रूप में काम किया। लेकिन मेरी विंडोज 8 मशीन पर यह नहीं है। –

+0

दाएं, यह बहुत पहले से-विंडोज़ काम करता है .Net 4.5 लेकिन कारणों के लिए अप्राप्य कारणों से, सिस्टम ब्रश से ट्रिगर मानों को गतिशील संसाधनों के साथ हार्ड-कोड किए गए रंग मानों में बदल दिया गया है। इसलिए, इस तरह के संसाधनों को ओवरराइड करना अब सूची बॉक्स को प्रभावित नहीं करेगा।मुझे लगता है कि स्थिति अन्य नियंत्रणों के लिए समान है, लेकिन मैंने इसे अभी तक सूची बॉक्स पर सत्यापित कर लिया है। – MojoFilter

1

मेरी मद DataTemplate के लिए निम्न ट्रिगर जोड़ा जा रहा है, Windows 10 के लिए काम किया:

<DataTemplate x:Key="MyItemTemplate"> 
    <Border Name="Border" Background="Transparent" BorderBrush="LightGray" BorderThickness="0,1,0,0" Padding="0"> 
     <TextBlock Text="{Binding Text}" HorizontalAlignment="Left" FontWeight="Medium" /> 
    </Border> 
    <DataTemplate.Triggers> 
     <DataTrigger Binding="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type ListBoxItem}}, Path=IsSelected}" Value="True"> 
      <Setter TargetName="Border" Property="Background" Value="SkyBlue"/> 
     </DataTrigger> 
    </DataTemplate.Triggers> 
</DataTemplate> 
संबंधित मुद्दे