2010-07-22 25 views
41

मैं एक System.Windows.Media.Color मान को System.indows.Media.Brush में कनवर्ट करना चाहता हूं। रंग मान एक आयताकार वस्तु की भर संपत्ति के लिए डेटाबेस है। भरने की संपत्ति ब्रश ऑब्जेक्ट लेती है, इसलिए मुझे रूपांतरण करने के लिए एक IValueConverter ऑब्जेक्ट की आवश्यकता होती है।मैं XAML में रंग को ब्रश में कैसे परिवर्तित करूं?

क्या WPF में अंतर्निहित कनवर्टर है या क्या मुझे अपना खुद का निर्माण करने की आवश्यकता है? यदि आवश्यक हो तो मैं अपना खुद का निर्माण कैसे करूं?

+0

संभावित डुप्लिकेट: http://stackoverflow.com/questions/372693/convert-string-to-brushes-brush-name-in-c नहीं –

+1

मैं करता हूँ लगता है कि यह एक डुप्लिकेट है।मैं कलर ऑब्जेक्ट से कन्वर्ट करना चाहता हूं, स्ट्रिंग वैल्यू जैसे "लाल"। और मैं इसे एक्सएएमएल कनवर्टर के रूप में कार्यान्वित करना चाहता हूं, बनाम सी # कोड में रूपांतरण कर रहा हूं। – dthrasher

उत्तर

56

ऐसा लगता है कि आपको अपना स्वयं का कनवर्टर बनाना है। यहाँ एक सरल उदाहरण शुरू करने के लिए:

public class ColorToSolidColorBrushValueConverter : IValueConverter { 

    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) { 
     if (null == value) { 
      return null; 
     } 
     // For a more sophisticated converter, check also the targetType and react accordingly.. 
     if (value is Color) { 
      Color color = (Color)value; 
      return new SolidColorBrush(color); 
     } 
     // You can support here more source types if you wish 
     // For the example I throw an exception 

     Type type = value.GetType(); 
     throw new InvalidOperationException("Unsupported type ["+type.Name+"]");    
    } 

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) { 
     // If necessary, here you can convert back. Check if which brush it is (if its one), 
     // get its Color-value and return it. 

     throw new NotImplementedException(); 
    } 
} 

इसके इस्तेमाल के लिये संसाधन अनुभाग में यह घोषणा।

<local:ColorToSolidColorBrushValueConverter x:Key="ColorToSolidColorBrush_ValueConverter"/> 

और यह एक स्थिर संसाधन के रूप में उपयोग बंधन में:

Fill="{Binding Path=xyz,Converter={StaticResource ColorToSolidColorBrush_ValueConverter}}" 

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

+0

धन्यवाद एक गुच्छा @ क्रिस वेलेंटाइन। यद्यपि जेन्स के जवाब में शानदार लालित्य है, मेरे मामले में मैं इसका उपयोग करने में सक्षम नहीं था और मुझे कनवर्टर का उपयोग करना पड़ा। या शायद मैं नहीं देख सकता कि मेरे मामले में SolidColorBrush को कैसे कार्यान्वित करें। – philologon

121

मुझे पता है कि मैं पार्टी के लिए वास्तव में देर से हूं, लेकिन इसके लिए आपको कनवर्टर की आवश्यकता नहीं है।

आप

<Rectangle> 
    <Rectangle.Fill> 
     <SolidColorBrush Color="{Binding YourColorProperty}" /> 
    </Rectangle.Fill> 
</Rectangle> 
+2

यह समाधान स्वीकृत उत्तर से काफी बेहतर है। धन्यवाद! –

+3

हालांकि मुझे यह समाधान पसंद है, लेकिन वास्तव में यहां बताए गए कष्टप्रद चेतावनियों का परिणाम होता है: http://stackoverflow.com/questions/7926204/cannot-find-governing-frameworkelement-warning-when-binding-inside-datatemp – l33t

6

मैं क्योंकि मैं Color करने के लिए बाध्य के लिए बहुत कुछ किया है के बजाय जेन्स 'जिस तरह से इस एचसीएल की जिस तरह से करना चाहता था कर सकता है, इसलिए वहाँ कम दोहराव और बॉयलर-प्लेट .Fill नोड्स है।

हालांकि इसे लिखने का प्रयास करते समय, ReSharper ने मुझे ColorToSolidColorBrushConverter के WPF Toolkit के कार्यान्वयन की ओर इशारा किया।

xmlns:Toolkit="clr-namespace:Microsoft.Windows.Controls.Core.Converters;assembly=WPFToolkit.Extended" 

फिर खिड़की/UserControl संसाधनों में एक स्थिर संसाधन: आप मुख्य विंडो/UserControl नोड में निम्न नाम स्थान घोषणा शामिल करने की ज़रूरत

<Toolkit:ColorToSolidColorBrushConverter x:Key="colorToSolidColorBrushConverter" /> 

तो फिर तुम यह एचसीएल की उत्तर की तरह कर सकते हैं:

<Rectangle Fill="{Binding Color, Converter={StaticResource colorToSolidColorBrushConverter}}" /> 
3

एचसीएल उत्तर में कुछ और वृद्धि के साथ, मैंने इसका परीक्षण किया - यह काम करता है।

public class ColorToSolidColorBrushValueConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     if (value == null) 
      return null; 

     if (value is Color) 
      return new SolidColorBrush((Color)value); 

     throw new InvalidOperationException("Unsupported type [" + value.GetType().Name + "], ColorToSolidColorBrushValueConverter.Convert()"); 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     if (value == null) 
      return null; 

     if (value is SolidColorBrush) 
      return ((SolidColorBrush)value).Color; 

     throw new InvalidOperationException("Unsupported type [" + value.GetType().Name + "], ColorToSolidColorBrushValueConverter.ConvertBack()"); 
    } 

} 
+0

पोस्ट करने के बाद यह .. मैंने जेन्स जवाब देखा .. जो सटीक है :) –

1

कनवर्टर:

[ValueConversion(typeof(SolidColorBrush), typeof(Color))] 
public class SolidBrushToColorConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     if (!(value is SolidColorBrush)) return null; 
     var result = (SolidColorBrush)value; 
     return result.Color; 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 
} 

XAML:

//... 
<converters:SolidBrushToColorConverter x:Key="SolidToColorConverter" /> 
//... 
<Color> 
    <Binding Source="{StaticResource YourSolidColorBrush}" 
      Converter="{StaticResource SolidToColorConverter}"> 
    </Binding> 
</Color> 
//... 
3

एक Converter यहां जरूरत नहीं है। आप में Brush को परिभाषित कर सकते हैं और इसका उपयोग कर सकते हैं। Brush को Resource के रूप में परिभाषित करना बेहतर होगा ताकि इसे आवश्यक अन्य स्थानों का उपयोग किया जा सके।

XAML रूप में नीचे है:

<Window.Resources> 
    <SolidColorBrush Color="{Binding ColorProperty}" x:Key="ColorBrush" /> 
</Window.Resources> 
<Rectangle Width="200" Height="200" Fill="{StaticResource ColorBrush}" /> 
संबंधित मुद्दे