2009-04-27 35 views
12

ब्रश अपने सिस्टम को लागू करने के लिए कैसे काम करता है, इस बारे में पर्याप्त जानकारी कहां मिल सकती है। Windows.Media.brush? मैं सभी फ्रीज करने योग्य सामानों को संभाल सकता हूं, लेकिन यह वास्तव में स्पष्ट नहीं है कि मुझे इसे काम करने के लिए ओवरराइड करने की आवश्यकता है।मैं WPF में कस्टम ब्रश को कैसे कार्यान्वित करूं?


हाँ, तो मैं यह मतलब नहीं था कि मैं एक पूर्वनिर्धारित ब्रश का उपयोग करना चाहते। मैं System.Windows.Media.brush का विस्तार करना चाहता हूं, जो एक अमूर्त वर्ग है। यह सब मेरे स्वयं के संपादन के लिए पूरी तरह से है। मुझे यह भी यकीन नहीं है कि मैं किस तरह का ब्रश कर सकता हूं। मैं बस सीखने की कोशिश कर रहा था कि ब्रश कैसे काम करते हैं। में के रूप में:

public AwesomeBrush : Brush 
{ 

    protected override Freezable CreateInstanceCore() 
    { 
     return new AwesomeBrush(); 
    } 

    ... // concrete brush stuff 

} 
+0

आप जो करने की कोशिश कर रहे हैं उसके बारे में थोड़ी अधिक जानकारी प्रदान करना सहायक हो सकता है। सुनिश्चित नहीं है कि ब्रश बनाने में क्या लगेगा, लेकिन यहां wpf में बनाए गए कई ब्रश की एक अच्छी सूची है: http://msdn.microsoft.com/en-us/library/aa970904.aspx –

उत्तर

3

आप System.Windows.Media.Brush वर्ग से इनहेरिट द्वारा एक कस्टम WPF ब्रश नहीं कर सकते, क्योंकि उस वर्ग सार सदस्यों को बताया कि आंतरिक होते हैं।

आप System.Windows.Media.Brush वर्ग के स्रोत कोड को देखना परावर्तक का उपयोग करते हैं, तो आपको निम्न आंतरिक सार तरीकों देखेंगे:

internal abstract DUCE.ResourceHandle AddRefOnChannelCore(DUCE.Channel channel); 
internal abstract DUCE.Channel GetChannelCore(int index); 
internal abstract int GetChannelCountCore(); 
internal abstract DUCE.ResourceHandle GetHandleCore(DUCE.Channel channel); 
internal abstract void ReleaseOnChannelCore(DUCE.Channel channel); 

ये अधिरोहित किया जाना चाहिए, लेकिन नहीं हो सकता है क्योंकि वे आंतरिक हैं।

नोट: मेरा उत्तर संपादित किया क्योंकि पिछला उत्तर लगभग System.Drawing.Brush था और इस प्रश्न के लिए अप्रासंगिक था। उनकी टिप्पणी के लिए मिक्को रतनेन को विशेष धन्यवाद।

+4

आप ब्रश क्लास से प्राप्त कर सकते हैं - जैसा कि आपने कहा था, यह अमूर्त और अमूर्त वर्ग विरासत में होना चाहिए। –

+0

ब्रश के बारे में क्या है जो इसे विरासत में असमर्थ बनाता है? मुझे पता है कि सभी कार्यान्वयन बंद कर दिए गए हैं, लेकिन हमें ब्रश से प्राप्त करने में सक्षम होना चाहिए, है ना? – MojoFilter

+1

आप आंतरिक रचनाकारों को डरते हैं! मैं तुम्हारे सामने पहले से फूला गया हूँ! – MojoFilter

9

मुझे Reflector का उपयोग कर मौजूदा ब्रश पर त्वरित रूप से देखा गया था। ऐसा लगता है कि उनके कार्यान्वयन को बहुत बंद कर दिया गया है और internal प्लंबिंग पर निर्भर करता है। हालांकि अपने खुद के ब्रश को लागू करना संभव हो सकता है ऐसा लगता है कि यह एक समर्थित विकल्प नहीं है। यह भी हो सकता है कि डब्ल्यूपीएफ नियंत्रण मौजूदा ब्रश के साथ कसकर बंधे हैं और एक कस्टम के साथ काम नहीं करेंगे।

कस्टम ब्रश जैसा कुछ हासिल करने का सबसे अच्छा तरीका कुछ जटिल ड्राइंग तर्क के साथ DrawingBrush का उपयोग करना है। आप ड्रॉइंग ब्रश को अन्य ब्रश का उपयोग करके जटिल आकार से बना सकते हैं ताकि आपको आवश्यक लक्ष्य प्राप्त करने दे।

अद्यतन संपादन के बाद

इस के रूप में शिक्षा के लिए है, तो आप परावर्तक को डाउनलोड करने और कैसे ब्रश काम को देखने के लिए कि का उपयोग कर बंद सबसे अच्छा हो सकता है। वे स्वयं लागू होने के लिए नहीं हैं और चूंकि वे internal कक्षाओं पर भरोसा करते हैं, जिनके लिए प्रोग्रामर सामान्य रूप से एक्सेस नहीं करते हैं, ऐसा करना मुश्किल होगा।

हालांकि यह दिलचस्प बनाता है कि Brush documentation ब्रश से प्राप्त करने के सही तरीके से मार्गदर्शन करने के लिए विरासतकर्ताओं के लिए एक टिप्पणी है।

अधिक अद्यतन

जब चारों ओर poking मैं एक काफी साफ रास्ता एक chinese blog पर कुछ इसी तरह प्राप्त करने के लिए मिल गया। एक मार्कअप एक्सटेंशन का उपयोग करने की चाल है, इसलिए यह बस ब्रश की तरह दिखता है। हकीकत में यह अपने गुणों के आधार पर एक नया छवि ब्रश बनाता है। ऐसा लगता है कि वह एक ही निष्कर्ष पर आया कि कुछ आंतरिक वर्ग हैं जो आसान कार्यान्वयन को रोकते हैं।

+0

मुझे संदेह है कि यह मामला भी है। मैं कुछ भी है कि ब्रश ढांचे में प्रदान की कार्यान्वयन, मैं सिर्फ अगर वहाँ ऐसी बातें यह वास्तव में पुनः उपयोग के लिए चालाक बनाने के लिए componentize के लिए मजेदार तरीके हो सकते हैं सोच रहा था के साथ नहीं किया जा सकता है कल्पना नहीं कर सकते। – MojoFilter

+0

एक अद्यतन जोड़ा गया जो ब्रश को विस्तारित किए बिना कुछ समान प्राप्त करता है। –

+1

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

3

मैंने कस्टम ब्रश बनाने के समाधान के लिए हर संभव कोण की कोशिश की, मार्कअप एक्सटेंशन का उपयोग टाइपकॉन्टर विशेषताओं के साथ गड़बड़ करने के लिए करने के बाद, फिर यह मुझ पर आ गया: आप बस निर्भरता ऑब्जेक्ट के आधार पर एक रैपर वर्ग बनाते हैं, ब्रश प्रकार की निर्भरता प्रॉपर्टी बनाएं , अपने अनुकूलन को लागू करें, फिर ब्रश निर्भरता प्रॉपर्टी से जुड़ें।

बाद में, संसाधन

में कस्टम ब्रश डाल
<l:CustomBrush x:Key="CustomBrush" Brush="Magenta" /> 

तो यह प्रति आबद्ध:

<Line X1="0" Y1="-5" X2="200" Y2="-5" 
     Stroke="{Binding Source={StaticResource CustomBrush}, Path=Brush}" 
     StrokeThickness="12"/> 

मुझे लगता है कि क्योंकि आप संसाधन में एक नहीं रख सकते हैं और कर सकते हैं इस MarkupExtension समाधान की तुलना में बेहतर है इसलिए आपको हर बार कस्टम सेटिंग्स को फिर से परिभाषित करना होगा।

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

यहाँ साधारण क्लास है:

public class CustomBrush : DependencyObject 
{ 
    public CustomBrush() 
    { 
     this.Brush = Brushes.Azure;  
    } 

    #region Brush DependencyProperty 

    [BindableAttribute(true)] 
    public Brush Brush 
    { 
    get { return (Brush)GetValue(BrushProperty); } 
    set { SetValue(BrushProperty, value); } 
    } 
    public static readonly DependencyProperty BrushProperty = 
     DependencyProperty.Register(
     "Brush", 
     typeof(Brush), 
     typeof(CustomBrush), 
     new UIPropertyMetadata(null)); 

    #endregion   
} 
4

कारण है कि आप एक कस्टम ब्रश एक जटिल ज्यामिति विचार करना चाह सकते का प्रश्न का उत्तर देने और जब तक बदल रहा है आप एक ढाल है कि आकार से मेल खाता के साथ इसे भरने के लिए चाहते हैं आकृति के केंद्र से मूल रूप से रंग (या किसी भी मनमाने ढंग से शुरुआती बिंदु)।

वहाँ एक स्थिर भरने के साथ ऐसा करने का कोई तरीका नहीं है (जो काफी सभी मौजूदा ब्रश समाप्त) है। ऑब्जेक्ट को प्रतिलिपि बनाने और उन्हें घोंसले करने के लिए छोटा (और इसे सभी को सही दिखने के लिए हलचल का काम करना), प्रत्येक को एक अलग रंग से भरना, एकमात्र व्यावहारिक तरीका एक ब्रश होना है जो वस्तु को भरने पर देख सकता है ।

यह वास्तव में फार्म में संभव है।

लेकिन वहाँ WPF में किसी भी तरह से यह करने के लिए है, जो दुर्भाग्यपूर्ण है है जैसे कि यह नहीं लगती है।

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

संबंधित मुद्दे