मैं छवि नियंत्रण से विरासत में मिली एक कस्टम क्लास बनाने की कोशिश कर रहा हूं और मुझे बाध्यकारी में कुछ परेशानी हो रही है।

मैं अपने संसाधनों में DrawingImage का उपयोग कर रहा हूं (यही वह है जो वेक्टर छवि के लिए आपूर्ति की जाती है)

इसलिए मेरे App.xaml संसाधनों में मेरे पास कुछ DrawingImages हैं, एक का उदाहरण:

<DrawingImage x:Key="Shutdown">
            <DrawingImage.Drawing>
                <DrawingGroup>
                    <DrawingGroup.Children>
                        <DrawingGroup>
                            <DrawingGroup.Children>
                                <GeometryDrawing Brush="{x:Null}">
                                    <GeometryDrawing.Pen>
                             Here-->    <Pen Brush="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type local:IconImage}}, Path=Colour, UpdateSourceTrigger=PropertyChanged}" Thickness="2" />
                                    </GeometryDrawing.Pen>
                                    <GeometryDrawing.Geometry>
                                        <PathGeometry FillRule="Nonzero" Figures="M8.332,4.941C5.759,6.271 4,8.956 4,12.052 4,16.47 7.582,20.052 12,20.052 16.418,20.052 20,16.47 20,12.052 20,8.911 18.19,6.193 15.555,4.884" />
                                    </GeometryDrawing.Geometry>
                                </GeometryDrawing>
                       Here-->  <GeometryDrawing Brush="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type local:IconImage}}, Path=Colour, UpdateSourceTrigger=PropertyChanged}" Pen="{x:Null}">
                                    <GeometryDrawing.Geometry>
                                        <RectangleGeometry RadiusX="0" RadiusY="0" Rect="11,2,2,10" />
                                    </GeometryDrawing.Geometry>
                                </GeometryDrawing>
                            </DrawingGroup.Children>
                            <DrawingGroup.ClipGeometry>
                                <RectangleGeometry Rect="0,0,24,24" />
                            </DrawingGroup.ClipGeometry>
                        </DrawingGroup>
                    </DrawingGroup.Children>
                </DrawingGroup>
            </DrawingImage.Drawing>
        </DrawingImage>

और मैंने अपना कस्टम वर्ग निम्नानुसार बनाया है:

 public class IconImage : Image
{
    public enum Icons
    {
        None,
        Shutdown,
        Minimize
    }

    private Icons _icon;
    public Icons Icon
    {
        get { return _icon; }
        set
        {
            _icon = value;
            if (value == Icons.None)
            {
                Visibility = Visibility.Hidden;
            }
            else
            {
                Visibility = Visibility.Visible;
                this.SetResourceReference(Image.SourceProperty, value.ToString());
            }
        }
    }

    public static readonly DependencyProperty ColourProperty = DependencyProperty.Register("Colour", typeof(Brush), typeof(IconImage), new PropertyMetadata(Brushes.Black));

    public Brush Colour
    {
        get { return (Brush)GetValue(ColourProperty); }
        set { SetValue(ColourProperty, value); }
    }
}

उपयोग:

<local:IconImage Icon="Shutdown" Colour="CornflowerBlue" />

समस्या यह है कि DrawingImages में मेरी ब्रश बाइंडिंग कस्टम क्लास में मेरे कलर डिपेंडेंसीप्रॉपर्टी से बंधी नहीं है और मुझे नहीं पता कि इसे कैसे पूरा किया जाए, या, यदि यह संभव हो तो। अगर मैं ब्रश को हार्ड कोड करता हूं तो यह पूरी तरह से काम करता है (जाहिर है)। मुझे डिज़ाइन समय पर, या किसी भी समय कोड के पीछे नियंत्रण से उनका रंग बदलने में सक्षम होना चाहिए।

अग्रिम में धन्यवाद!

-सीन-

2
Sean Makins 26 अक्टूबर 2017, 05:18

2 जवाब

सबसे बढ़िया उत्तर

आप इसे इस तरह काम कर सकते हैं। पहले संसाधन को गैर-साझा के रूप में चिह्नित करें, क्योंकि आप अपने DrawingImage को उपस्थिति बदलना चाहते हैं जिसके आधार पर यह IconImage का हिस्सा है, जो साझा संसाधन के लिए ज्यादा मायने नहीं रखता (इस मामले में साझा किया गया) मतलब सिंगलटन की तरह - केवल एक वैश्विक उदाहरण):

<DrawingImage x:Key="Shutdown" x:Shared="False">
    <!-- the rest -->
</DrawingImage>

फिर SetResourceReference का उपयोग करने के बजाय इसे इस तरह करें:

var resource = FindResource(value.ToString());
// alternative
// var resource = Application.Current.Resources[value.ToString()];
this.Source = (ImageSource)resource;     

यह मोटे तौर पर आपके DrawingImage xaml को सीधे IconImage के तहत डालने जैसा ही होगा जैसा कि अन्य उत्तर बताता है।

पेड़ के नीचे एक ही नाम के साथ संसाधनों के आकस्मिक उपयोग से बचने के लिए आपके पास अपने संसाधनों के लिए और अधिक अद्वितीय नाम हैं (विशेषकर यदि आप FindResource का उपयोग करने जा रहे हैं)।

0
Evk 26 अक्टूबर 2017, 13:41
<local:IconImage Icon="Shutdown" Colour="CornflowerBlue">
    <local:IconImage.Source>
        <DrawingImage>
            <DrawingImage.Drawing>
                <DrawingGroup>
                    <DrawingGroup.Children>
                        <DrawingGroup>
                            <DrawingGroup.Children>
                                <GeometryDrawing Brush="{x:Null}">
                                    <GeometryDrawing.Pen>
                                        <Pen Brush="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type local:IconImage}}, Path=Colour, UpdateSourceTrigger=PropertyChanged}" Thickness="2" />
                                    </GeometryDrawing.Pen>
                                    <GeometryDrawing.Geometry>
                                        <PathGeometry FillRule="Nonzero" Figures="M8.332,4.941C5.759,6.271 4,8.956 4,12.052 4,16.47 7.582,20.052 12,20.052 16.418,20.052 20,16.47 20,12.052 20,8.911 18.19,6.193 15.555,4.884" />
                                    </GeometryDrawing.Geometry>
                                </GeometryDrawing>
                                <GeometryDrawing Brush="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type local:IconImage}}, Path=Colour, UpdateSourceTrigger=PropertyChanged}" Pen="{x:Null}">
                                    <GeometryDrawing.Geometry>
                                        <RectangleGeometry RadiusX="0" RadiusY="0" Rect="11,2,2,10" />
                                    </GeometryDrawing.Geometry>
                                </GeometryDrawing>
                            </DrawingGroup.Children>
                            <DrawingGroup.ClipGeometry>
                                <RectangleGeometry Rect="0,0,24,24" />
                            </DrawingGroup.ClipGeometry>
                        </DrawingGroup>
                    </DrawingGroup.Children>
                </DrawingGroup>
            </DrawingImage.Drawing>
        </DrawingImage>
    </local:IconImage.Source>
</local:IconImage>
-1
Iron 26 अक्टूबर 2017, 06:22