样式化UserControls

时间:2012-04-27 13:33:32

标签: wpf user-controls styles custom-controls

下面的UserControl工作正常但我想更容易更改样式。

我尝试过的一件事是将Style移动到ResourceDictionary中的通用按钮样式,但是会出现错误,如下所示。

我尝试的另一件事是将其转换为自定义控件,但这是this question的主题

目前有几个类似的按钮定义为UserControls。是否有推荐的方法来改变所有这些的风格?

干杯

尝试使用其他样式

应用样式失败
<Style TargetType="{x:Type Button}">
    <Setter Property="Style" Value="{StaticResource blueButtonStyle}"/>
</Style>

Error: Style object is not allowed to affect the style property of the object to which it applies

UserControl XAML

<UserControl.Resources>
    <ResourceDictionary Source="pack://application:,,,/Smack.Core.Presentation.Wpf;component/Themes/generic.xaml" />
</UserControl.Resources>

<Button x:Name="_button" Style="{StaticResource blueButtonStyle}" Command="{Binding AddNewItemCommand}"  >
    <StackPanel Orientation="Horizontal" >
        <Image Source="{resx:Resx ResxName=Smack.Core.Presentation.Resources.MasterDetail, Key=bullet_add}" Stretch="Uniform" VerticalAlignment="Center" />
        <AccessText x:Name="_accesText" VerticalAlignment="Center">_Add New Subject</AccessText>
        <ContentPresenter/>
    </StackPanel>
</Button>

UserControl代码落后

public partial class AddNewItemButton : UserControl
{
    public AddNewItemButton() { InitializeComponent(); }

    public static readonly DependencyProperty SubjectProperty = DependencyProperty.Register(
        "Subject", typeof (string), typeof (AddNewItemButton),
        new FrameworkPropertyMetadata(OnSubjectChanged));

    public string Subject { get { return (string) GetValue(SubjectProperty); } set { SetValue(SubjectProperty, value); } }

    private static void OnSubjectChanged(DependencyObject obj, DependencyPropertyChangedEventArgs args) {
        var control = obj as AddNewItemButton;
        if (control == null) return;

        control._accesText.Text = "_" + string.Format(MasterDetail.Subject_AddNew_Label, control.Subject.Capitalize());

        control._button.ToolTip = string.Format(MasterDetail.Subject_AddNew_ToolTip, control.Subject.ToLower());
    }

}

1 个答案:

答案 0 :(得分:7)

使用第一种方法可能会有更好的运气:

<Style TargetType="{x:Type Button}">
    <Setter Property="Style" Value="{StaticResource blueButtonStyle}"/>
</Style>

通过在样式中设置样式会导致错误,这是可以理解的。相反,您可以使用“BasedOn”属性强制您的“默认”样式继承您想要的样式;

<Style TargetType="{x:Type Button}" BasedOn="{StaticResource blueButtonStyle}">
    <!-- Nothing Here --> 
</Style>

那应该做你想要的;也就是说,如果我理解你的问题(说实话,似乎有点不清楚)。

作为旁注,没有任何理由为此按钮使用自定义用户控件。这可以通过常规按钮完成,使用WPF的核心工具(如Bindings和Converters)在按钮内容和工具提示中显示动态变化的文本。