在WPF UserControl上应用样式的问题

时间:2011-09-19 12:02:38

标签: c# wpf user-controls coding-style

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

<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>

我哪里错了? -Thanks

2 个答案:

答案 0 :(得分:5)

使用亲爱的@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>

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

  

...当您使用UserControl时,这意味着已经知道其布局,并且无需进一步设置控件的样式。您正在两次同时定义其样式因此导致碰撞......

他补充道:

  

相反,你应该使用CustomControl;在 Themes 文件夹中定义默认样式(如果您拥有常规Visual Studio,则会自动生成)。之后,您可以覆盖您自己的应用中的默认样式。与普通基类及其派生类似。

     

关注此:   http://www.codeproject.com/KB/WPF/WPFCustomControl.aspx ......

显然,在这种情况下,我们需要从ContentControl类(而不是Control类)派生我们的无形控件。您可以查看this&amp; this掌握详细信息。

在此,我再次感谢@Mario。 ;)

答案 1 :(得分:0)

您正在提供Style="{StaticResource ResourceKey=MyUserControlStyle}"

只是 - Style="{StaticResource MyUserControlStyle}"