2010-03-16 14 views
7

शायद का भरण रंग एक सरल प्रश्न बदलने के लिए बाइंडिंग लेकिन:WPF अंडाकार

मैं कैसे प्रोग्राम के रूप में एक अंडाकार है कि एक चर के आधार पर XAML में परिभाषित किया गया है का रंग बदल सकता हूँ?

बाध्यकारी पर मैंने जो कुछ भी पढ़ा है वह संग्रह और सूचियों पर आधारित है-क्या मैं इसे स्ट्रिंग चर के मान के आधार पर बस (और शाब्दिक रूप से) सेट नहीं कर सकता? स्ट्रिंग रंग = "लाल" रंग = "# एफएफ 0000"

उत्तर

6

आपको ब्रश ऑब्जेक्ट में रंग बदलने के लिए एक कस्टम कनवर्टर लागू करने की आवश्यकता होगी। कुछ इस तरह ...

public class ColorToBrushConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     System.Drawing.Color col = (System.Drawing.Color)value; 
     Color c = Color.FromArgb(col.A, col.R, col.G, col.B); 
     return new System.Windows.Media.SolidColorBrush(c); 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     SolidColorBrush c = (SolidColorBrush)value; 
     System.Drawing.Color col = System.Drawing.Color.FromArgb(c.Color.A, c.Color.R, c.Color.G, c.Color.B); 
     return col; 
    } 
} 

और फिर अपने बंधन

 
Fill="{Binding Colors.Red, Converter={StaticResource ColorToBrushConverter }" 
+0

यदि आप 'रंग' ऑब्जेक्ट की बजाय 'ब्रश' ऑब्जेक्ट में कनवर्ट करेंगे तो यह सही होगा। बस 'कलर कनवर्टर' के बजाय 'ब्रश कनवर्टर' का उपयोग करके चाल चलनी चाहिए। हालांकि मुझे लगता है कि आपको उस कनवर्टर के उदाहरण की आवश्यकता है, 'ConvertFromString' विधि स्थिर नहीं है, है ना? –

+0

यदि आप रंग का उपयोग करके बाध्य करते हैं तो आप कलर क्लास का उपयोग करने के लिए स्वतंत्र हैं, जिसमें रंगीन नामों पर इंटेलिजेंस भी है। –

+1

ये कन्वर्टर्स * पहले से मौजूद हैं * .... –

15

यह उनका कहना है कि कनवर्टर अन्य पदों संदर्भ पहले से ही मौजूद है है, जो तुम क्यों कर सकते हैं लायक है कि कनवर्टर निर्दिष्ट पहली जगह में xaml में <Ellipse Fill="red">। कनवर्टर System.Windows.Media.BrushConverter है:

कोड ऊपर पूरी तरह से काम करता है: -1 और टिप्पणियों के जवाब में

myEllipse.Fill = new SolidColorBrush(Colors.Red); 

संपादित:

 BrushConverter bc = new BrushConverter(); 
     Brush brush = (Brush) bc.ConvertFrom("Red"); 

अधिक कुशल तरीका पूर्ण सिंटैक्स का उपयोग करने के लिए है कोड कोड में, जो मूल प्रश्न पूछ रहा था। आप IValueConverter चाहते हैं - इन्हें आम तौर पर बाध्यकारी परिदृश्यों के लिए उपयोग किया जाता है। एक TypeConverter यहां सही समाधान है (क्योंकि आप एक स्ट्रिंग को स्ट्रिंग में ब्रश में कनवर्ट कर रहे हैं)। विवरण के लिए this article देखें।

आगे संपादित (Aviad की टिप्पणी को पुन: पढ़ने के बाद): आप स्पष्ट रूप से Xaml में TypeConverter उपयोग करने की आवश्यकता नहीं है - यह आप के लिए प्रयोग किया जाता है। अगर मैं यह लिख Xaml में:

<Ellipse Fill="red"> 

... तो क्रम स्वतः एक BrushConverter का उपयोग करता स्ट्रिंग एक ब्रश में शाब्दिक चालू करने के लिए। Xaml अनिवार्य रूप से बराबर पूरे अक्षरों में लिखावट में बदल जाता है यही कारण है कि:

<Ellipse> 
    <Ellipse.Fill> 
    <SolidColorBrush Color="#FFFF0000" /> 
    </Ellipse.Fill>    
</Ellipse> 

तो तुम सही हो - आप Xaml में इसका इस्तेमाल नहीं कर सकते हैं - लेकिन आप की जरूरत नहीं है।

भले ही आपके पास स्ट्रिंग मान था कि आप भरने के रूप में बांधना चाहते हैं, तो आपको मैन्युअल रूप से कनवर्टर निर्दिष्ट करने की आवश्यकता नहीं है। Kaxaml से यह परीक्षण:

<Page 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:s="clr-namespace:System;assembly=mscorlib"> 
    <Page.Resources> 
    <s:String x:Key="col">Red</s:String> 
    </Page.Resources> 

    <StackPanel> 
    <Ellipse Width="20" Height="20" Fill="{Binding Source={StaticResource col}}" /> 
    </StackPanel> 
</Page> 

अजीब, तो आप सिर्फ StaticResource col उपयोग कर सकते हैं नहीं है और अभी भी यह काम किया है - लेकिन यह बाध्यकारी है और स्वचालित रूप से ValueConverter का उपयोग करता है एक ब्रश में स्ट्रिंग चालू करने के लिए।

+0

यह सवाल का जवाब नहीं देता है, 'ब्रश कनवर्टर' 'IValueConverter' लागू नहीं करता है ताकि आप इसे एक्सएएमएल में उपयोग नहीं कर सकें। –

+1

यहां जवाब देने के बजाय मेरा उत्तर संपादित किया क्योंकि मुझे लगता है कि यह सही मायने में क्यों है, यह इंगित करने योग्य है ... –

1

उपयोग

"System.Windows.Media" 

अगर आपके XAML में अपने अंडाकार के के 'नाम' इस तरह "my_ellipse", अपने कोड में कुछ है:

my_ellipse.Fill = System.Windows.Media.Brushes.Red; 

या इस:

my_ellipse.Fill = (SolidColorBrush)new BrushConverter().ConvertFromString("#F4F4F5") 
संबंधित मुद्दे