2011-04-22 13 views
24

मैं XAMLकोड में नियंत्रण टेम्पलेट कैसे सेट करें?

<ControlTemplate TargetType="{x:Type Button}"> 
    <Image ...> 
</ControlTemplate> 

में यह है मैं सी # कोड में एक ही हासिल करना चाहते हैं। इसे कैसे प्राप्त किया जा सकता है?

ControlTemplate ct = new ControlTemplate();.. 
Image img = new Image();.. 

अब टेम्पलेट को नियंत्रित करने के लिए इस छवि को कैसे असाइन करें? क्या हम यह कर सकते हैं या क्या मुझे यहां कोई अवधारणा याद आ रही है?

उत्तर

26

कोडबेहिंड में टेम्पलेट बनाना एक अच्छा विचार नहीं है, सिद्धांत में यह ControlTemplate.VisualTree को परिभाषित करके ऐसा करेगा जो FrameworkElementFactory है।

ControlTemplate template = new ControlTemplate(typeof(Button)); 
var image = new FrameworkElementFactory(typeof(Image)); 
template.VisualTree = image; 

गुण नियत बहुत राउंडअबाउट है जब से तुम SetValue और SetBinding उपयोग करने की आवश्यकता:

image.SetValue(Image.SourceProperty, ...); 

इसके अलावा, (पहले) स्वीकार किए जाते हैं जवाब और सामान उद्धृत के बारे में:

स्थापना ControlTemplate प्रोग्रामेटिक रूप से XAML का उपयोग करने जैसा है क्योंकि हमें एक्स का उपयोग करना है amlReader वर्ग।

यही बयान सिर्फ गलत है, हम नहीं "करने के लिए है" है।


तो मैं रन टाइम पर टेम्पलेट्स मैं एक संसाधन है जो मैं अगर मैं इसकी आवश्यकता लोड कर सकते हैं के रूप में उन्हें परिभाषित आवंटित।


संपादित करें: प्रलेखन FrameworkElementFactory के अनुसार अब मान्य नहीं है:

इस वर्ग प्रोग्राम के रूप में टेम्पलेट्स, जो इस तरह के ControlTemplate या DataTemplate के रूप में FrameworkTemplate की उपवर्गों हैं बनाने के लिए एक पदावनत रास्ता है; जब आप इस वर्ग का उपयोग कर टेम्पलेट बनाते हैं तो सभी टेम्पलेट कार्यक्षमता उपलब्ध नहीं होती है। प्रोग्रामेटिक रूप से टेम्पलेट बनाने का अनुशंसित तरीका XamlReader क्लास की लोड विधि का उपयोग कर स्ट्रिंग या मेमोरी स्ट्रीम से XAML लोड करना है।

मुझे आश्चर्य है कि यह सिफारिश इतनी अच्छी विचार है। व्यक्तिगत रूप से मैं अभी भी एक्सएएमएल में संसाधन के रूप में टेम्पलेट को परिभाषित करने के साथ जाऊंगा यदि मैं तारों और XamlReader के साथ ऐसा करने से बच सकता हूं।

+0

धन्यवाद पूरी तरह से काम किया है ... मुझे पता है यह एक अच्छा विचार नहीं है, लेकिन मैं एक विशेष मामले –

+0

खैर में कोई विकल्प नहीं है, मैं सिर्फ बोली पाठ साइट मैंने पाया .. और क्या XamlReader.Parse का उपयोग कर 'के साथ गलत फार्म '? –

+0

@Ai_boy: यह सिर्फ एक्सएएमएल की पार्सिंग है, जो अनावश्यक है और कुछ ऐसा नहीं है जो मैं अनुशंसा करता हूं, यदि आपके पास स्थिर एक्सएएमएल है तो इसे एक्सएमएल संसाधन के रूप में बनाने के बजाय इसे एक्सएमएल स्ट्रिंग को कोड-बैक में हैक करने के बजाय बेहतर बनाना है। –

21

http://www.eggheadcafe.com/sample-code/SilverlightWPFandXAML/73fdb6a2-6044-4c43-8766-afa12618ddc1/set-controltemplate-programmatically.aspx

ControlTemplate स्थापना प्रोग्राम के रूप में सिर्फ XAML का उपयोग कर, क्योंकि हम XamlReader वर्ग का उपयोग करने के समान है। उदाहरण के लिए, यहां बटन के टेम्पलेट को सेट करने के लिए कोड है, यह मानते हुए कि हम लोड होने के बाद बटन के टेम्पलेट को सेट करना चाहते हैं।

private void Button_Loaded(object sender, RoutedEventArgs e) { 
    var button = sender as Button; 
    string template = 
     "<ControlTemplate xmlns='http://schemas.microsoft.com/winfx/2006/xaml/presentation' 
      TargetType=\"Button\">" + 
      "<Border>" + 
       "<ContentPresenter/>" + 
      "</Border>" + 
     "</ControlTemplate>"; 
    button.Template = (ControlTemplate)XamlReader.Parse(template); 
} 

जब से हम टेम्पलेट के लिए को निर्दिष्ट XAML कोड के लिए एक स्ट्रिंग का इस्तेमाल किया है, हम XamlReader के पार्स विधि का उपयोग कर सकते हैं। XamlReader में एक लोड विधि भी है, जिसका मुख्य रूप से स्ट्रीम या XAML या XML पाठकों के लिए उपयोग किया जाता है। ध्यान दें कि हम में एक्सएमएल नेमस्पेस http://schemas.microsoft.com/winfx/2006/xaml/presentation शामिल करना है क्योंकि ControlTemplate, Border, और हमें आवश्यक अन्य नियंत्रण परिभाषित किए गए हैं। अगर हमने इसे शामिल नहीं किया है, तो हम रनटाइम अपवाद का सामना करेंगे। मूल रूप से, हमें टेम्पलेट द्वारा आवश्यक नामस्थान रखना होगा।

0

यदि आपको केवल बटन छवि को बदलने की आवश्यकता है तो आप एक काम कर सकते हैं।
1. एक निर्भरता संपत्ति बनाएं जो तब प्रदर्शित करेगी जब आप छवि (एक बूल) को बदलना चाहते हैं या हो सकता है कि आप एक enum बना सकें जिसमें सभी संभावित छवियां 2. Enum छवियां {Image1 = 0, Image2 = 1, छवि 2 = 3}। इस प्रकार के एक निर्भरता संपत्ति "CurrentButtonImage" बनाएं जो बटन से जुड़ी होगी।

अब XAML में बटन टेम्पलेट

में इस का उपयोग CurrentButtonImage की संपत्ति बदलें पर (पीछे कोड में) बटन की छवि

CurrentImagePropertyChangedhandler (...., ...) का उपयोग करते हुए अद्यतन
{
स्विच (CurrentButtonImage)
{
मामले "Image1":
this._ButtonImage.Fill = (DrawingBrush) csd.FindResource ("Image1DrawingBrus ज ");

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