2011-01-28 21 views
5

यह काम क्यों नहीं करेगा?सिल्वरलाइट डिफ़ॉल्ट सामग्री सामग्री सामग्री

एक कस्टम नियंत्रण के लिए generic.xaml में:

शैली कस्टम नियंत्रण के लिए आवेदन किया है ...

<Setter Property="ChromeContent"> 
    <Setter.Value> 
    <Grid /> 
    </Setter.Value> 
</Setter> 

...

बाद में, नियंत्रण टेम्पलेट में ...

<ContentPresenter Grid.Column="0" 
    x:Name="ChromeContentPresenter" 
    Content="{TemplateBinding ChromeContent}" /> 

यहां निर्भरता समर्थक है क्रोमकंटेंट के लिए perty ...

public Object ChromeContent 
{ 
    get { return (Object)GetValue(ChromeContentProperty); } 
    set { SetValue(ChromeContentProperty, value); } 
} 
public static readonly DependencyProperty ChromeContentProperty = 
    DependencyProperty.Register("ChromeContent", typeof(Object), 
    typeof(casPopup), null); 

जैसा कि आप देख सकते हैं, यह कोई वस्तु लेता है। मैंने इसे ग्रिड में बदलने की कोशिश की, लेकिन इससे मदद नहीं मिली।

यह (जावास्क्रिप्ट से) इस त्रुटि फेंकता है: _Failed संपत्ति 'System.Windows.Controls.ContentPresenter.Content'

अजीब तरह, निम्नलिखित तरीके से कार्य करेंगे करने के लिए आवंटित करने के लिए करता है, तो मैं सिर्फ एन डी सेटर से ग्रिड को दूर उपयोग पाठ:

<Setter Property="ChromeContent" Value="DEFAULT" /> 

इसके अलावा, इस नियंत्रण कक्षा में OnApplyTemplate विधि से भी काम करेगा:

Grid g = new Grid(); 
    g.Width = 100; 
    g.Height = 25; 
    g.Background = new SolidColorBrush(Colors.LightGray); 
    ChromeContent = g; 

मैं एक कठिन समय अंडर आ रही हैं काम करने से जेनेरिक.एक्सएएमएल में परिभाषित ग्रिड की डिफ़ॉल्ट सामग्री को रोकने से क्या चल रहा है। क्या किसी को इस मामले पर कोई ज्ञान है?

आपकी मदद के लिए अग्रिम धन्यवाद!

<Setter Property="ChromeContent"> 
    <Setter.Value> 
    <Grid /> 
    </Setter.Value> 
</Setter> 

आप एक UIElement शामिल नहीं होना चाहिए सीधे एक संसाधन शब्दकोश में या एक शैली का एक मूल्य के रूप में -:

उत्तर

6

यह समस्या है। आप शैली को कुछ प्रकार के वर्णनकर्ता के रूप में देख सकते हैं लेकिन यह नहीं है। शैली में मूल्यों को उनके द्वारा रखी गई वस्तुओं के उदाहरण बनाए जाते हैं। आपकी शैली में Grid का एक उदाहरण है। जब भी उस शैली का उपयोग ChromeContent संपत्ति को असाइन करने के लिए किया जाता है, तो वह ग्रिड के एकल उदाहरण को गधे करने का प्रयास करेगा।

UIElement केवल एक माता-पिता का बच्चा हो सकता है। क्या होगा यदि दो नियंत्रण आपके नियंत्रण का निर्माण किया गया था? वहां होगा (यदि चांदी की रोशनी आपको दे) तो एकल दोनों नियंत्रणों के लिए ग्रिड के उदाहरण को असाइन करने का प्रयास करें।

यह ControlTemplate और DataTemplate जैसे टेम्पलेट्स का एक कारण है। Xaml पहले पार्स किए जाने के बजाए टेम्पलेट का उपयोग हर बार इनके अंदर मार्कअप का उपयोग किया जाता है।

संपादित:

आप अनुपूरक प्रश्न DataTemplate उत्तर देने के लिए, आप प्रकार का एक और संपत्ति डिफ़ॉल्ट होना चाहिए: -

<Setter Property="ChromeContentTemplate"> 
    <Setter.Value> 
    <DataTemplate> 
     <Grid /> 
    </DataTemplate> 
    </Setter.Value> 
</Setter> 

संपत्ति: -

public Object ChromeContentTemplate 
{ 
    get { return (DataTemplate)GetValue(ChromeContentTemplateProperty); } 
    set { SetValue(ChromeContentTemplateProperty, value); } 
} 

public static readonly DependencyProperty ChromeContentTemplateProperty= 
    DependencyProperty.Register("ChromeContentTemplate", typeof(DataTemplate), 
    typeof(casPopup), null); 

नियंत्रण खाका: -

<ContentPresenter Grid.Column="0" 
    x:Name="ChromeContentPresenter" 
    Content="{TemplateBinding ChromeContent}" 
    ContentTemplate="{TemplateBinding ChromeContentTemplate" /> 
+0

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

+0

समझ गया। आपकी मदद के लिए बहुत बहुत धन्यवाद! – maulkye

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