是否可以将控件子类化(在我的例子中是AppBarToggleButton)并“继承”基类的TargetType?我想要实现的是拥有稍微定制的AppBarToggleButton(禁用自动切换行为)放入CommandBar并使其看起来与常规AppBarToggleButton完全一样(即接收在给定的命令栏控件模板中为AppBarToggleButton定义的样式)他们说,DefaultStyleKey应该会有帮助,但它继承得很好,但是,唉,似乎没有参与本地样式解析/查找。
AppBarToggleButton
TargetType
CommandBar
DefaultStyleKey
mitkmikd1#
出于各种目的,我可能需要对其他控件进行子类化,因此这里的最终目标是了解局部样式解析在内部是如何工作的,以及目标示例是否参与其中,或者它完全是一个外部过程。一般来说,我们需要为自定义的AppBarToggleButton制作模板控件。当我们用Visual Studio制作模板控件时,它会在Themes文件夹中生成Generic.xaml文件,用于声明自定义控件的样式。自定义控件的cs文件如下所示。
Generic.xaml
public sealed class CustomAppBarToggleButton : AppBarToggleButton { public CustomAppBarToggleButton() { this.DefaultStyleKey = typeof(CustomAppBarToggleButton); } }
如果不想编辑默认样式,可以删除用于绑定当前控件与Generic.xaml文件中样式的DefaultStyleKey行。打开Generic.xaml文件,你会发现以下内容。它是空的样式。如果我们想做一些小的变化,你需要复制完整的AppBarToggleButton样式来替换它,并编辑TargetType到local:CustomAppBarToggleButton。然后你可以根据自己的要求编辑样式。
local:CustomAppBarToggleButton
<Style TargetType="local:CustomAppBarToggleButton" > <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="local:CustomAppBarToggleButton"> <Border Background="{TemplateBinding Background}" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}"> </Border> </ControlTemplate> </Setter.Value> </Setter> </Style>
如果你想创建一个新的依赖属性,请在cs文件中定义它,然后使用TemplateBinding绑定样式中的属性。更多信息请查看document。
TemplateBinding
htrmnn0y2#
我也有类似的需求,想知道答案是否还是一样。我已经扩展了基本的组合框控件,以满足一些行为要求。
class ExtendedComboBox : ComboBox
我希望ExtendedComboBox示例继承最新的平台样式,但它们的样式不同。第一个是ExtendedComboBox(方角,较大的字形),而第二个是通用ComboBox(圆角,较小的字形)。
要求是两个组合框的样式相同。我不愿意为ExtendedComboBox创建一个显式样式,因为如果通用组合框的样式改变了,ExtendedComboBox将不再匹配。有什么方法可以只继承标准样式吗?
eoigrqb63#
对于任何仍然遇到这个问题的人,我设法解决了一个类似的问题,使用这里描述的https://stackoverflow.com/a/71338869/10468107方法从Button继承具体而言,添加
<Style BasedOn="{StaticResource DefaultButtonStyle}" TargetType="local:MyButton" />
我已经解决了这个问题。因此,使用{StaticResource Default<TYPE>Style},它可能也适用于其他类型
{StaticResource Default<TYPE>Style}
3条答案
按热度按时间mitkmikd1#
出于各种目的,我可能需要对其他控件进行子类化,因此这里的最终目标是了解局部样式解析在内部是如何工作的,以及目标示例是否参与其中,或者它完全是一个外部过程。
一般来说,我们需要为自定义的
AppBarToggleButton
制作模板控件。当我们用Visual Studio制作模板控件时,它会在Themes文件夹中生成Generic.xaml
文件,用于声明自定义控件的样式。自定义控件的cs文件如下所示。如果不想编辑默认样式,可以删除用于绑定当前控件与Generic.xaml文件中样式的
DefaultStyleKey
行。打开
Generic.xaml
文件,你会发现以下内容。它是空的样式。如果我们想做一些小的变化,你需要复制完整的AppBarToggleButton
样式来替换它,并编辑TargetType
到local:CustomAppBarToggleButton
。然后你可以根据自己的要求编辑样式。如果你想创建一个新的依赖属性,请在cs文件中定义它,然后使用
TemplateBinding
绑定样式中的属性。更多信息请查看document。htrmnn0y2#
我也有类似的需求,想知道答案是否还是一样。我已经扩展了基本的组合框控件,以满足一些行为要求。
我希望ExtendedComboBox示例继承最新的平台样式,但它们的样式不同。第一个是ExtendedComboBox(方角,较大的字形),而第二个是通用ComboBox(圆角,较小的字形)。
要求是两个组合框的样式相同。我不愿意为ExtendedComboBox创建一个显式样式,因为如果通用组合框的样式改变了,ExtendedComboBox将不再匹配。有什么方法可以只继承标准样式吗?
eoigrqb63#
对于任何仍然遇到这个问题的人,我设法解决了一个类似的问题,使用这里描述的https://stackoverflow.com/a/71338869/10468107方法从Button继承
具体而言,添加
我已经解决了这个问题。因此,使用
{StaticResource Default<TYPE>Style}
,它可能也适用于其他类型