我在一个 WPF 项目中工作,在该项目中我CheckBox
为一些特殊操作覆盖了控件。那工作正常。
我的问题是ControlTemplate
从主题(来自codeplex的shinyred.xaml)应用的那个没有应用于我的覆盖控件。有没有办法继承CheckBox
ControlTemplate
供我的新控件使用?
CheckBox
我能找到的所有样本都集中在继承ControlTemplate
.
我在一个 WPF 项目中工作,在该项目中我CheckBox
为一些特殊操作覆盖了控件。那工作正常。
我的问题是ControlTemplate
从主题(来自codeplex的shinyred.xaml)应用的那个没有应用于我的覆盖控件。有没有办法继承CheckBox
ControlTemplate
供我的新控件使用?
CheckBox
我能找到的所有样本都集中在继承ControlTemplate
.
不,正如您所说,可以通过使用BasedOn
属性“继承”样式,但不能直接“继承”模板。这是可以理解的,模板继承的语义是什么?派生模板如何能够以某种方式添加或更改基本模板中的元素?
使用样式是完全可能的,因为您可以简单地添加Setters
,Triggers
等。模板继承唯一可以想象的可能是添加Triggers
到基本模板。但是,在这种情况下,您必须熟悉基本模板中的元素名称,并且基本模板中的元素名称更改可能会破坏您的派生模板。更不用说可读性问题了,您在派生模板中引用了一个名称,该名称完全在其他地方定义。
迟来的加法说了这么多,有可能解决您的特定问题(尽管我现在怀疑它仍然是您的问题,甚至是问题)。您只需使用属性的 setter 为您的控件定义样式Template
:
<Style TargetType="<your type>">
<Setter Property="Template" Value="{StaticResource <existing template resource name>}"/>
</Style>
请记住@Aviad 所说的,以下是一种解决方法:
假设你有一个Button
定义你想要 ihnerit 的模板,将你的定义CustomButton
为自定义控件,如下所示:
public class CustomButton : Button
{
static CustomButton()
{
DefaultStyleKeyProperty.OverrideMetadata(typeof(CustomButton), new FrameworkPropertyMetadata(typeof(CustomButton)));
}
public static readonly DependencyProperty TextProperty = DependencyProperty.Register("Text",
typeof(string), typeof(CustomButton), new UIPropertyMetadata(null));
public string Text
{
get { return (string)GetValue(TextProperty); }
set { SetValue(TextProperty, value); }
}
}
然后转到您的 Generic.xaml 并定义以下内容:
<Style
x:Key="CustomButtonStyle" TargetType="{x:Type local:CustomButton}">
<Setter Property="FontSize" Value="18" /> <!--Override the font size -->
<Setter Property="FontWeight" Value="Bold" />
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type local:CustomButton}">
<Button Style="{StaticResource ButtonStyleBase}"
Height="{TemplateBinding Height}"
Command="{Binding RelativeSource={RelativeSource AncestorType={x:Type local:CustomButton}}, Path=Command}"
CommandParameter="{Binding}"
Width="{TemplateBinding Width}">
<Grid>
<StackPanel>
<Image Source="Image/icon.jpg" />
<TextBlock Text="{TemplateBinding Text}"></TextBlock>
</StackPanel>
</Grid>
</Button>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
请注意,我们要继承模板的按钮被包裹在我的新模板中,并且样式设置为现有按钮。使用复选框以相同的方式组织复选框和标签,例如在 CustomCheckBox 的新 ControlTemplate 中垂直组织