दुर्भाग्य से, कस्टम ब्रश WPF में समर्थित नहीं हैं (ब्रश प्रकार 'आंतरिक' चिह्नित कर रहे हैं और से विरासत में मिला नहीं किया जा सकता), इसलिए एक ब्रश दोनों का मिश्रण है कि बनाने ब्रश जो XAML से सामान्य SolidColorBrush की तरह उपयोग किया जा सकता है, संभव नहीं है।
कामकाज के रूप में, आप एक कस्टम ब्रश के व्यवहार को अनुकरण करने के लिए मार्कअप एक्सटेंशन का उपयोग कर सकते हैं, जो आपको XAML वाक्यविन्यास का उपयोग करने और कस्टम मान प्रदान करने की अनुमति देता है, जो हमें अंतर्निहित SolidColorBrush का उपयोग करने की अनुमति देता है (कोई कस्टम ब्रश आवश्यक नहीं है
/// <summary>
/// Markup extension to mix two SolidColorBrushes together to produce a new SolidColorBrush.
/// </summary>
[MarkupExtensionReturnType(typeof(SolidColorBrush))]
public class MixedColorBrush : MarkupExtension, INotifyPropertyChanged
{
/// <summary>
/// The foreground mix color; defaults to white.
/// If not changed, the result will always be white.
/// </summary>
private SolidColorBrush foreground = Brushes.White;
/// <summary>
/// The background mix color; defaults to black.
/// If not set, the result will be the foreground color.
/// </summary>
private SolidColorBrush background = Brushes.Black;
/// <summary>
/// PropertyChanged event for WPF binding.
/// </summary>
public event PropertyChangedEventHandler PropertyChanged;
/// <summary>
/// Gets or sets the foreground mix color.
/// </summary>
public SolidColorBrush Foreground
{
get
{
return this.foreground;
}
set
{
this.foreground = value;
this.NotifyPropertyChanged("Foreground");
}
}
/// <summary>
/// Gets or sets the background mix color.
/// </summary>
public SolidColorBrush Background
{
get
{
return this.background;
}
set
{
this.background = value;
this.NotifyPropertyChanged("Background");
}
}
/// <summary>
/// Returns a SolidColorBrush that is set as the value of the
/// target property for this markup extension.
/// </summary>
/// <param name="serviceProvider">Object that can provide services for the markup extension.</param>
/// <returns>The object value to set on the property where the extension is applied.</returns>
public override object ProvideValue(IServiceProvider serviceProvider)
{
if (this.foreground != null && this.background != null)
{
// Create a new brush as a composite of the old ones
// This does simple non-perceptual additive color, e.g
// blue + red = magenta, but you can swap in a different
// algorithm to do subtractive color (red + yellow = orange)
return new SolidColorBrush(this.foreground.Color + this.background.Color);
}
// If either of the brushes was set to null, return an empty (white) brush.
return new SolidColorBrush();
}
/// <summary>
/// Raise the property changed event.
/// </summary>
/// <param name="propertyName">Name of the property which has changed.</param>
protected void NotifyPropertyChanged(string propertyName)
{
if (this.PropertyChanged != null)
{
this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
}
कौन सा तो आप एक सामान्य ब्रश के रूप में XAML से इस्तेमाल किया जा सकता:
<Grid>
<Grid.Background>
<local:MixedColorBrush Foreground="Blue" Background="Red"/>
</Grid.Background>
</Grid>
या मार्कअप विस्तार वाक्य रचना का उपयोग करके:
) मूल्य जब दो रंगों के मिश्रण में आप प्राप्त करने के लिए सेट
<Grid Background="{local:MixedColorBrush Foreground=Blue, Background=Red}">
इस दृष्टिकोण का नकारात्मक पक्ष यह है कि आप अपने आवेदन में अन्य संसाधनों के मूल्यों को बांधने के लिए डायनामिक रिसोर्स या स्टेटिक रिसोर्स संदर्भों का उपयोग नहीं कर सकते हैं। MarkupExtension निर्भरता नहीं है, और संसाधन बाध्यकारी केवल निर्भरता ऑब्जेक्ट्स पर काम करता है; अंतर्निहित ब्रश निर्भरता ऑब्जेक्ट्स हैं, यही कारण है कि पारंपरिक ब्रश के साथ बाध्यकारी काम करता है।
स्रोत
2009-05-25 23:51:39
अच्छा उदाहरण ...लेकिन मैं इस के एक्सएएमएल संस्करण की उम्मीद कर रहा था ... – Entrodus