2012-10-03 9 views
9

this के अनुसार, ControlBrushKey संसाधन को ओवरराइड करने पर फ़ोकसबॉक्स चयनित आइटम के पृष्ठभूमि रंग को फोकस नहीं होने चाहिए।फोकस में नहीं होने पर ListBoxItem पृष्ठभूमि रंग को ओवरराइड करना (.NET 4.5)

<StackPanel> 
    <ListBox> 
     <ListBox.Resources> 
     <SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}" Color="LightBlue"/> 
     <!--SelectedItem without focus but doesn't really work--> 
     <SolidColorBrush x:Key="{x:Static SystemColors.ControlBrushKey}" Color="Orange" /> 
     </ListBox.Resources> 
     <ListBoxItem> 
     Item 1 
     </ListBoxItem> 
     <ListBoxItem> 
     Item 2 
     </ListBoxItem> 
    </ListBox> 
    <TextBox></TextBox> 
    </StackPanel> 

आप देख सकते हैं आप इस में .NET 4.5 चलाते हैं कि यह केवल बदल जाता में फोकस रंग, लेकिन नहीं नहीं-इन-फोकस (यह काम करता है: मैं इस का खंडन करने के लिए एक सरल उदाहरण बनाया। नेट 4.0)। कोई विचार क्यों?

संपादित करें: यह List/Combo Box Background And Selected Colours Under .net 4.5 का डुप्लिकेट प्रतीत होता है।

+0

[सूची/कॉम्बो बॉक्स पृष्ठभूमि और चयनित रंगों के तहत चयनित 4.5 के संभावित डुप्लिकेट] (http://stackoverflow.com/questions/12007918/list-combo-box-background-and-selected-colours-under-net -4-5) –

उत्तर

1

यह नियंत्रण के डिफ़ॉल्ट templates के बारे में है, अगर वे .NET 4 में सिस्टम रंगों का उपयोग नहीं करते हैं तो यह कुछ भी नहीं बदलेगा।

+0

क्या यह एक तोड़ने वाला परिवर्तन नहीं है? और वैसे भी ऐसा लगता है कि ControlBrushKey अभी भी उपयोग किया जा रहा है। –

+0

@DoronYaacoby: यह एक तोड़ने वाला बदलाव नहीं है क्योंकि नियंत्रण टेम्पलेट के भीतर किसी भी चीज़ पर निर्भर मूर्खतापूर्ण है। यह प्रतिबिंब के माध्यम से निजी तरीकों का आह्वान करने जैसा है। –

+0

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

13

चयनित ListBoxItem की पृष्ठभूमि का रंग बदल रहा है जब यह फोकस खो दिया है के लिए निम्नलिखित का प्रयास करें:

XAML

<ListBox.Resources>  
    <SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}" Color="LightBlue"/> 
    <SolidColorBrush x:Key="{x:Static SystemColors.InactiveSelectionHighlightBrushKey }" Color="Orange" />  
</ListBox.Resources> 

सी #

listBox.Resources.Add(SystemColors.InactiveSelectionHighlightBrushKey, 
         new SolidColorBrush(Colors.Orange)); 

मुझे आशा है कि यह आप के लिए काम करता है।

+1

एक ऐसे समाधान के लिए मेरा उत्तर देखें जिसमें सिस्टमकॉलर्स को शामिल नहीं किया गया है। – bugged87

-2

इस का हल

InitializeComponent(); 
+0

अपवाद फेंकता है: "संपत्ति 'AreInactiveSelectionHighlightBrushKeys समर्थित' को बदला नहीं जा सकता है। 'फ्रेमवर्क कॉम्पैबिलिटी प्रेफरेंस' वर्ग को सील कर दिया गया है।" – bugged87

+0

@ bugged87 इसे कोशिश/पकड़ ब्लॉक के अंदर जोड़ें। मेरे प्रोग्राम इसका उपयोग करते हैं और सब कुछ विंडोज – Daniel

+0

के सभी संस्करणों के इरादे से दिखता है, निश्चित रूप से, एक प्रयास/पकड़ जोड़ना अपवाद को संभालता है, लेकिन यह कोड ओपी का कोड काम नहीं कर रहा है। मैं विंडोज 8.1 पर .NET 4.5 का उपयोग कर रहा हूं। – bugged87

0

बुला यहाँ मुझे लगता है कि के साथ आया था प्रणाली रंग या नियंत्रण टेम्पलेट्स बदलते को शामिल नहीं करता है से पहले

FrameworkCompatibilityPreferences.AreInactiveSelectionHighlightBrushKeysSupported = false; 

जोड़ रहा है। बस एक नए उपयोगकर्ता नियंत्रण में ListBox लपेटें।

public partial class StyledListBox : UserControl 
{ 
    public DataTemplate ItemTemplate 
    { 
     get { return (DataTemplate)GetValue(ItemTemplateProperty); } 
     set { SetValue(ItemTemplateProperty, value); } 
    } 

    public IEnumerable ItemsSource 
    { 
     get { return (IEnumerable)GetValue(ItemsSourceProperty); } 
     set { SetValue(ItemsSourceProperty, value); } 
    } 

    public object SelectedItem 
    { 
     get { return GetValue(SelectedItemProperty); } 
     set { SetValue(SelectedItemProperty, value); } 
    } 

    public StyledListBox() 
    { 
     InitializeComponent(); 
    } 

    public static readonly DependencyProperty ItemTemplateProperty = DependencyProperty.Register("ItemTemplate", typeof(DataTemplate), typeof(StyledListBox), new FrameworkPropertyMetadata(null)); 
    public static readonly DependencyProperty ItemsSourceProperty = DependencyProperty.Register("ItemsSource", typeof(IEnumerable), typeof(StyledListBox), new FrameworkPropertyMetadata(null)); 

    public static readonly DependencyProperty SelectedItemProperty = DependencyProperty.Register("SelectedItem", typeof(object), typeof(StyledListBox), new FrameworkPropertyMetadata(null) 
    { 
     BindsTwoWayByDefault = true, 
     DefaultUpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged 
    }); 
} 

XAML:

<UserControl x:Class="StyledListBox" 

    <ListBox ItemsSource="{Binding ItemsSource, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type common:StyledListBox}}}" 
       SelectedItem="{Binding SelectedItem, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type common:StyledListBox}}}"> 

     <ListBox.ItemTemplate> 
      <DataTemplate> 
       <Border> 
        <Border.Style> 
         <Style TargetType="{x:Type Border}"> 
          <Style.Triggers> 
           <DataTrigger Binding="{Binding IsSelected, UpdateSourceTrigger=PropertyChanged, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListBoxItem}}}" 
              Value="True"> 
            <Setter Property="Background" Value="Red" /> 
           </DataTrigger> 
          </Style.Triggers> 
         </Style> 
        </Border.Style> 

        <ContentPresenter ContentTemplate="{Binding ItemTemplate, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type StyledListBox}}}" /> 
       </Border> 
      </DataTemplate> 
     </ListBox.ItemTemplate> 
    </ListBox> 
</UserControl> 

तब बस अपने आवरण UserControl का उपयोग के रूप में अगर यह एक ListBox थे। आप जिस भी अन्य सूची बॉक्स गुणों को नियंत्रित करना चाहते हैं, उसे मेरे उदाहरण से ItemsSource और SelectedItem जैसे ही रैपर में जोड़ा जा सकता है।