在WPF用户控件上应用样式的问题

本文关键字:样式 问题 应用 WPF 用户 控件 | 更新日期: 2023-09-27 18:09:12

我有一个用户控件,我想在其他一些项目中使用它。当我直接设置一些值到它的属性时,没有问题:

<local:MyUserControl prop1="val1" prop2="val2">
    ...
</local:MyUserControl>

但是我不能给它应用样式。我试着:

<Window ...>
    <Window.Resources>
        <Style x:Key="MyUserControlStyle" TargetType="{x:Type local:MyUserControl}">
            <Setter Property="prop1" Value="val1"/>
            <Setter Property="prop2" Value="val2"/>
        </Style>
    </Window.Resources>
    <Grid>
        <local:MyUserControl Style="{StaticResource ResourceKey=MyUserControlStyle}">
            ...
        </local:MyUserControl>
    </Grid>
</Window>

我哪里错了?-谢谢

在WPF用户控件上应用样式的问题

使用亲爱的@Mario Vernari的说明,我发现问题是由于我在创建UserControl时使用了一个糟糕的策略。我想创建一个UserControl来容纳其他的。所以我试过了:

<UserControl x:Class="MyNamespace.MyUserControl"
             ...
             Style="{DynamicResource ResourceKey=MyUserControlStyle}">
    <UserControl.Resources>
        ...
        <Style x:Key="MyUserControlStyle" TargetType="{x:Type UserControl}">
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="{x:Type UserControl}">
                        <Border BorderBrush="{Binding Path=DP1}">
                            ...
                            <ContentPresenter ... Content="{TemplateBinding Content}"/>
                            ...
                        </Border>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
    </UserControl.Resources>
</UserControl>

其中DP1Brush类型的依赖属性。通过这种方式创建的UserControl可以直接设置其属性(如DP1)。这绝对不是@Mario告诉我的真实方式:

…当您使用UserControl时,这意味着您已经知道它的布局,并且不需要进一步设置控件的样式。您在同一时间定义了两次样式,因此会导致冲突…

他又说:

相反,你应该使用CustomControl;在Themes文件夹中定义默认样式(如果你拥有常规的Visual Studio,它会自动生成)。之后,你可以在你自己的应用中重写的默认样式。就像你对一个普通的基类和它的派生类所做的一样。

遵循:http://www.codeproject.com/KB/WPF/WPFCustomControl.aspx…

显然,在这种情况下,我们需要从ContentControl类(而不是Control类)派生我们的无外观控件。你可以看看这个&这要掌握细节。

在这里,我再次感谢@Mario。div;)

你给Style="{StaticResource ResourceKey=MyUserControlStyle}"

就是- Style="{StaticResource MyUserControlStyle}"