【发布时间】:2021-10-11 16:47:11
【问题描述】:
我有一个包含许多用户控件的类程序集。我想向此类程序集添加一种新型按钮,并且还想为其添加样式。具体来说,我想要一个包含多个图像的按钮,用于正常、悬停(IsMouseOver)和禁用状态。它还将包含要显示的文本。然后我可以使用这个类程序集在任何应用程序中添加它,如下所示:
<ns:ImageTextButton NormalImage="{StaticResource SomeImage}" HoverImage="{StaticResource SomeHoverImage}" Text={StaticResource SomeText}" />
首先我创建了一个 C# 类:
public class ImageTextButton : Button {
public DependencyProperty ImageProperty = DependencyProperty.Register(nameof(Image), typeof(DrawingBrush), typeof(ImageTextButton));
public DependencyProperty HoverImageProperty = DependencyProperty.Register(nameof(HoverImage), typeof(DrawingBrush), typeof(ImageTextButton));
public DependencyProperty TextProperty = DependencyProperty.Register(nameof(Text), typeof(string), typeof(ImageTextButton));
public DrawingBrush Image {
get { return GetValue(ImageProperty) as DrawingBrush; }
set { SetValue(ImageProperty, value); }
}
public DrawingBrush HoverImage {
get { return GetValue(HoverImageProperty) as DrawingBrush; }
set { SetValue(HoverImageProperty, value); }
}
public string Text {
get { return GetValue(TextProperty) as string; }
set { SetValue(TextProperty, value); }
}
}
然后我在 Styles.xaml 文件中创建了一个样式,该文件编译为 Resource。
<Style TargetType="{x:Type local:ImageTextButton}" x:Key="ImageTextButtonStyle">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="Button">
<Border BorderThickness="{TemplateBinding BorderThickness}"
BorderBrush="{TemplateBinding BorderBrush}"
CornerRadius="0" Background="{Binding RelativeSource={RelativeSource AncestorType=local:ImageTextButton}, Path=Image}">
<StackPanel>
<Canvas x:Name="canvas" Background="{Binding RelativeSource={RelativeSource AncestorType=local:ImageTextButton}, Path=Image}" />
<TextBlock Style="{Binding RelativeSource={RelativeSource AncestorType=local:ImageTextButton}, Path=TextStyle}"
Text="{Binding RelativeSource={RelativeSource AncestorType=local:ImageTextButton}, Path=Text}" />
</StackPanel>
</Border>
<ControlTemplate.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="Background" Value="{Binding RelativeSource={RelativeSource Mode=Self}, Path=HoverImage}" TargetName="canvas" />
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
我无法测试这种风格,而且很可能存在问题。我无法启动应用程序,因为上面的 TargetType 不存在。我相信这是因为我的 Styles.xaml 是一种资源,并且实际的类是编译的。我得到的错误是 Failed to create a 'Type' from text 'local:ImageTextButton'。
我怎样才能做到这一点?其次,有什么方法可以默认将此样式应用于此类型?我不想总是在此用户项的每个实例中指定 Style={StaticResource ImageTextButtonStyle}。
【问题讨论】:
-
DependencyProperty 字段必须是静态的。
-
@Clemens 是的,当然。感谢您指出。请向被否决的人解释我如何在未来改进我的问题。
标签: c# wpf xaml wpf-controls