2011-03-19 3 views
17

लिए काम नहीं कर रहा इस प्रकार मेरी ListBox की ItemContainerStyle में चलाता उपयोग करते हुए मेरे ListBoxItem रों लिए Background संपत्ति को बदलने की कोशिश:WPF: ListBoxItem.IsSelected के लिए उत्प्रेरक पृष्ठभूमि संपत्ति

<ListBox Height="100" HorizontalAlignment="Left" Margin="107,59,0,0" Name="listBox1" VerticalAlignment="Top" Width="239"> 
     <ListBox.ItemContainerStyle> 
      <Style TargetType="{x:Type ListBoxItem}"> 
       <Setter Property="Background" Value="Lightblue"/> 
       <Style.Triggers> 
        <Trigger Property="IsSelected" Value="true"> 
         <Setter Property="Background" Value="Red"/> 
        </Trigger> 
        <Trigger Property="IsMouseOver" Value="true"> 
         <Setter Property="Background" Value="Yellow"/> 
        </Trigger> 
       </Style.Triggers> 
      </Style> 
     </ListBox.ItemContainerStyle> 
     <ListBox.Items> 
      <ListBoxItem Content="First Item"/> 
      <ListBoxItem Content="SecondItem"/> 
      <ListBoxItem Content="Third Item"/> 
     </ListBox.Items> 
    </ListBox> 

मैं करने के लिए नहीं चुना जाता आइटम उम्मीद करेंगे हल्के नीले रंग की पृष्ठभूमि, ढीली वस्तुओं (यानी जब माउस कर्सर उनके ऊपर होता है) पीले रंग के होते हैं और चयनित आइटम लाल होते हैं।

अचयनित और ढीले आइटमों के लिए यह अपेक्षित काम कर रहा है, लेकिन चयनित वस्तुओं में अभी भी उनके मानक पृष्ठभूमि रंग हैं (यानी नीला, यदि सूची बॉक्स में अन्यथा फोकस और हल्का भूरा है)।

क्या मुझे कुछ भी याद आ रही है? क्या यह व्यवहार कहीं दस्तावेज है?

किसी भी संकेत के लिए धन्यवाद!

संपादित

मैं डिफ़ॉल्ट प्रणाली रंग अधिभावी (हर कोई एक जवाब के रूप में इस पोस्ट करने के लिए वैसे भी Change selected and unfocused Listbox style to not be grayed out में वर्णित है, धन्यवाद) के समाधान के बारे में पता कर रहा हूँ। हालांकि यह वही नहीं है जो मैं करना चाहता हूं। मुझे और अधिक दिलचस्पी है कि मेरा समाधान क्यों काम नहीं करता है।

मैं इसे परिभाषित करने के लिए ListItem के मानक ControlTemplate शक कर रहा हूँ खुद चलाता जो शैली (शायद किसी को इस की पुष्टि और कुछ संसाधन जहां इस व्यवहार परिभाषित किया गया है करने के लिए मुझसे बात कर सकते हैं) द्वारा निर्धारित ट्रिगर से अधिक precendence लेने के लिए लग रहे हैं। -

<Window.Resources> 
      <SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}" 
          Color="Red" /> 
</Window.Resources> 

और अपने कोड से IsSelected उत्प्रेरक को दूर

 <ListBox.ItemContainerStyle> 
      <Style TargetType="{x:Type ListBoxItem}"> 
       <Setter Property="Template"> 
        <Setter.Value> 
         <ControlTemplate TargetType="ListBoxItem"> 
          <Border Name="Border" Padding="2" SnapsToDevicePixels="true" Background="LightBlue" Margin="0"> 
           <ContentPresenter/> 
          </Border> 
          <ControlTemplate.Triggers> 
           <Trigger Property="IsSelected" Value="true"> 
            <Setter TargetName="Border" Property="Background" Value="Red"/> 
           </Trigger> 
          </ControlTemplate.Triggers> 
         </ControlTemplate> 
        </Setter.Value> 
       </Setter> 
      </Style> 
     </ListBox.ItemContainerStyle> 
+0

इस अर्थ में आप अभी तक सही समाधान का उपयोग करते हैं। मानक नियंत्रण टेम्पलेट के साथ और ब्रश ओवरराइडिंग के बिना कोई समाधान नहीं। – Sonorx

उत्तर

14

एयरो-स्टाइल पर प्रतिबिंबित करने का एक छोटा सा हिस्सा हमें एक स्पष्टीकरण प्रदान करता है कि यह सरल ट्रिगर-सेटिंग क्यों काम नहीं करती है।

ListBoxItem में ट्रिगर्स के साथ एक नियंत्रण टेम्पलेट है जो हमारे ट्रिगर पर प्राथमिकता लेता है। कम से कम यह एक मल्टीट्रिगर के लिए सच प्रतीत होता है। मैंने चयनित = सत्य के सरल ट्रिगर को ओवरराइड करने में कामयाब रहा है लेकिन multitrigger के लिए मुझे अपना खुद का ControlTemplate बनाना था।

<ControlTemplate TargetType="{x:Type ListBoxItem}"> 
    <ControlTemplate.Triggers> 
     <Trigger Property="IsSelected" Value="true"> 
      <Setter TargetName="Bd" Value="{DynamicResource {x:Static HighlightBrush}}" Property="Background" /> 
      <Setter Value="{DynamicResource {x:Static HighlightTextBrush}}" Property="Foreground" /> 
     </Trigger> 
     <MultiTrigger> 
      <MultiTrigger.Conditions> 
       <Condition Property="IsSelected" Value="true" /> 
       <Condition Property="IsSelectionActive" Value="false" /> 
      </MultiTrigger.Conditions> 
      <Setter TargetName="Bd" Value="{DynamicResource {x:Static ControlBrush}}" Property="Background" /> 
      <Setter Value="{DynamicResource {x:Static ControlTextBrush}}" Property="Foreground" /> 
     </MultiTrigger> 
     <Trigger Property="IsEnabled" Value="false"> 
      <Setter Value="{DynamicResource {x:Static GrayTextBrush}}" Property="Foreground" /> 
     </Trigger> 
    </ControlTemplate.Triggers> 
    <Border Name="Bd" Background="{TemplateBinding Background}" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Padding="{TemplateBinding Padding}" SnapsToDevicePixels="true"> 
     <ContentPresenter HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" /> 
    </Border> 
</ControlTemplate> 

आशा है कि यह चीजों को साफ करता है एक छोटा सा:

यह है कि समस्याग्रस्त MultiTrigger से पता चलता एयरो शैली से टेम्पलेट है। मैं समझ नहीं पा रहा हूं कि उन्होंने शैली को इतना अधिक क्यों बढ़ाया है।

4

कोशिश अपने विंडो संसाधनों को यह जोड़ने:

इस बीच के लिए मेरे समाधान की तरह मेरे ListItem रों के लिए एक ControlTemplate परिभाषित करने के लिए है , यह काम नहीं करेगा क्योंकि आपके सिस्टम थीम के आधार पर प्रत्येक सिस्टम में इसका डिफ़ॉल्ट हाइलाइट ब्रश होता है।

आपको इसे बनाने के लिए अपने कोड में हाइलाइट ब्रश को ओवरराइड करने की आवश्यकता है।

7

IsSelected ट्रिगर हटा सकते हैं और लिस्टबॉक्स में जोड़ें: अन्यथा

+0

मेरे लिए या तो काम नहीं करता है ._। –

0

के लिए ध्यान केंद्रित पल के लिए

<ListBox.Resources> 
    <SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}" 
         Color="Red" /> 
    <SolidColorBrush x:Key="{x:Static SystemColors.ControlBrushKey}" 
         Color="Red" /> 
</ListBox.Resources> 

पहले ब्रश अपने उत्प्रेरक के बजाय IsSelected में Selector.IsSelected का उपयोग करें।

+0

यह मदद नहीं करता है। – MartinStettner