【发布时间】:2021-08-06 08:40:01
【问题描述】:
我有一个问题,关于在 wpf 的自定义控件中实现默认样式。 我已经编写了自己的 IconButton 控件,该控件将两个可自定义的 TextBlocks 放入一个按钮控件中,这主要是有效的。这个样子是这样的:
<Style TargetType="{x:Type MyButton}" BasedOn="{StaticResource {x:Type Button}}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type MyButton}">
<Button>
<Button.Content>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition />
<ColumnDefinition />
</Grid.ColumnDefinitions>
<TextBlock
Grid.Column="0"
[...]>
</TextBlock>
<TextBlock
Grid.Column="1"
VerticalAlignment="Center"
Text="{TemplateBinding Text}"
[...]>
</TextBlock>
</Grid>
</Button.Content>
</Button>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
在相应的 MyButton.cs 中,我定义了两个 TextBlock 中引用的所有 DependencyProperties,如下所示:
public static readonly DependencyProperty TextProperty = DependencyProperty.Register(nameof(Text), typeof(string), typeof(IconButton), new FrameworkPropertyMetadata(string.Empty));
所有这些都有效。我知道我可以在 DepedencyProperty(此处为 string.Empty)中有一个默认值,如果我这样做,则可以通过在使用“MyButton”时定义一个新值来完全覆盖它。 但是显然,按钮也有常规样式,例如宽度和高度,由于某种原因,当我以我定义的样式定义它们时,我无法覆盖这些样式。除此之外,我还计划以默认样式为我的新依赖属性定义默认值(只是为了方便),但它似乎也不起作用。
我尝试过的两件事: (1) 使用按钮样式(显然只适用于按钮的 DepdendencyProperties 不适用于我的新按钮)
<Button.Style>
<Style TargetType="{x:Type Button}">
<Setter Property="MinWidth" Value="300"/>
<Setter Property="MinHeight" Value="24"/>
<Setter Property="FontSize" Value="12"/>
</Style>
</Button.Style>
或 (2) 在 TopLevel 上定义默认样式,即就像我用于模板的另一个常规设置器(也适用于我的新 DependencyProperties):
<Style TargetType="{x:Type MyButton}" BasedOn="{StaticResource {x:Type Button}}">
<Setter Property="Template">...</Setter>
<Setter Property="MinWidth">100</Setter>
</Style>
(2) 似乎是更好的解决方案,因为我认为它应该做我想做的一切,但它根本不起作用。我的样式更改均未应用。 (1) 正在工作,但显然仅适用于按钮样式。但是,也无法覆盖这些值,即当我使用时:
<local:MyButton [...] MinWidth="100"/>
它不会覆盖我所期望的样式!
请记住,我是初学者,这是我在 WPF 中的第一个自定义控件!谢谢大家的建议。
【问题讨论】:
-
如果要创建自定义控件,则需要设置默认模板键。在 WPF 中习惯上这个键是元素类型。您是否安装了此密钥?您是否创建了具有默认样式的主题?
-
嘿,设置默认模板密钥并安装该密钥是什么意思?这不是这条线的作用:
标签: wpf wpf-controls