यदि मेरे पास दो 200 लाइनें लंबे नियंत्रण टेम्पलेट्स हैं जो केवल कुछ शब्दों (कुछ रंग) में भिन्न होती हैं, तो मैं xaml को पुन: प्रयोज्य कैसे बना सकता हूं? यही है, टेम्पलेट को कॉपी-पेस्ट करने और 200 लाइनों में 3 शब्दों को बदलने की आवश्यकता नहीं है।WPF में पैरामीटरेटेड शैली/टेम्पलेट?
यहां एक सरलीकृत उदाहरण है। दोनों शैलियों के बीच एकमात्र अंतर सीमा रंग है। तो क्या मैं किसी भी प्रकार के बटन को एक पैरामीटर रंग के साथ परिभाषित कर सकता हूं, और ब्लैकबटन स्टाइल और ग्रेबटन स्टाइल का अधिग्रहण कर सकता हूं, और ब्लैकबटन स्टाइल और ग्रेबटन स्टाइल में केवल उस रंग को निर्दिष्ट कर सकता हूं?
alt text http://img444.imageshack.us/img444/9545/buttonstyles.png
<Window x:Class="WpfApplication33.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window1" Height="300" Width="300">
<Window.Resources>
<Style x:Key="BlackButtonStyle" TargetType="{x:Type Button}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type Button}">
<Border BorderBrush="Black" BorderThickness="3">
<ContentControl Content="{TemplateBinding Content}"/>
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
<Style x:Key="GrayButtonStyle" TargetType="{x:Type Button}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type Button}">
<Border BorderBrush="Gray" BorderThickness="3">
<ContentControl Content="{TemplateBinding Content}"/>
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</Window.Resources>
<StackPanel>
<Button Content="Black Button"
Style="{StaticResource BlackButtonStyle}"/>
<Button Content="Gray Button"
Style="{StaticResource GrayButtonStyle}"/>
</StackPanel>
</Window>
यहाँ 2 उत्तरों के आधार पर कोड है। केवल एक शैली नियंत्रण पर निर्धारित करने की आवश्यकता, लेकिन दुर्भाग्य से यह अभी भी नियंत्रण के टैग को खराब करता:
<Window x:Class="WpfApplication33.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window1" Height="300" Width="300">
<Window.Resources>
<Style x:Key="ButtonStyle" TargetType="{x:Type Button}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type Button}">
<Border Name="border"
BorderBrush="Black"
BorderThickness="3">
<ContentControl Content="{TemplateBinding Content}"/>
</Border>
<ControlTemplate.Triggers>
<Trigger Property="Tag" Value="Gray">
<Setter TargetName="border"
Property="BorderBrush"
Value="Gray"/>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
<Style x:Key="BlackButtonStyle"
TargetType="{x:Type Button}"
BasedOn="{StaticResource ButtonStyle}"/>
<Style x:Key="GrayButtonStyle"
TargetType="{x:Type Button}"
BasedOn="{StaticResource ButtonStyle}">
<Setter Property="Tag" Value="Gray"/>
</Style>
</Window.Resources>
<StackPanel>
<Button Content="Black Button"
Style="{StaticResource BlackButtonStyle}"/>
<Button Content="Gray Button"
Style="{StaticResource GrayButtonStyle}"/>
</StackPanel>
</Window>
हाँ, मैंने इसके बारे में भी सोचा, लेकिन यह मानक नियंत्रण के लिए काम नहीं करता है, यानी बटन, अगर मैं टैग का उपयोग करना टालना चाहता हूं। मुझे अपने सभी बटनों को एक कस्टम नियंत्रण में बदलने की आवश्यकता होगी। प्लस एक ही (टैग, स्टाइल) जोड़ी को कई बार निर्दिष्ट करते हुए अभी भी डुप्लिकेट कोड है, लेकिन शुरुआत में बहुत कम है। –
आप आसानी से UserControl बना सकते हैं जो इन सभी को encapsulates और रंग सेट करने के लिए निर्भरता प्रॉपर्टी प्रदान करता है। तब आपके पास कोई डुप्लिकेट कोड नहीं होगा। लेकिन आप अतिरिक्त डेटा स्टोर करने के लिए किसी प्रकार की अलग इकाई बनाने से नहीं बच सकते हैं। – Charlie