XAML UWP -子类化内置控件并继承样式行为

mutmk8jj  于 2023-01-06  发布在  其他
关注(0)|答案(3)|浏览(162)

是否可以将控件子类化(在我的例子中是AppBarToggleButton)并“继承”基类的TargetType?我想要实现的是拥有稍微定制的AppBarToggleButton(禁用自动切换行为)放入CommandBar并使其看起来与常规AppBarToggleButton完全一样(即接收在给定的命令栏控件模板中为AppBarToggleButton定义的样式)他们说,DefaultStyleKey应该会有帮助,但它继承得很好,但是,唉,似乎没有参与本地样式解析/查找。

mitkmikd

mitkmikd1#

出于各种目的,我可能需要对其他控件进行子类化,因此这里的最终目标是了解局部样式解析在内部是如何工作的,以及目标示例是否参与其中,或者它完全是一个外部过程。
一般来说,我们需要为自定义的AppBarToggleButton制作模板控件。当我们用Visual Studio制作模板控件时,它会在Themes文件夹中生成Generic.xaml文件,用于声明自定义控件的样式。自定义控件的cs文件如下所示。

public sealed class CustomAppBarToggleButton : AppBarToggleButton
{
    public CustomAppBarToggleButton()
    {
        this.DefaultStyleKey = typeof(CustomAppBarToggleButton);
    }
}

如果不想编辑默认样式,可以删除用于绑定当前控件与Generic.xaml文件中样式的DefaultStyleKey行。
打开Generic.xaml文件,你会发现以下内容。它是空的样式。如果我们想做一些小的变化,你需要复制完整的AppBarToggleButton样式来替换它,并编辑TargetTypelocal: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

htrmnn0y

htrmnn0y2#

我也有类似的需求,想知道答案是否还是一样。我已经扩展了基本的组合框控件,以满足一些行为要求。

class ExtendedComboBox : ComboBox

我希望ExtendedComboBox示例继承最新的平台样式,但它们的样式不同。第一个是ExtendedComboBox(方角,较大的字形),而第二个是通用ComboBox(圆角,较小的字形)。

要求是两个组合框的样式相同。我不愿意为ExtendedComboBox创建一个显式样式,因为如果通用组合框的样式改变了,ExtendedComboBox将不再匹配。有什么方法可以只继承标准样式吗?

eoigrqb6

eoigrqb63#

对于任何仍然遇到这个问题的人,我设法解决了一个类似的问题,使用这里描述的https://stackoverflow.com/a/71338869/10468107方法从Button继承
具体而言,添加

<Style BasedOn="{StaticResource DefaultButtonStyle}" TargetType="local:MyButton" />

我已经解决了这个问题。因此,使用{StaticResource Default<TYPE>Style},它可能也适用于其他类型

相关问题