【问题标题】:Issue with applying style on WPF UserControl在 WPF UserControl 上应用样式的问题
【发布时间】:2011-09-19 12:02:38
【问题描述】:

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

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

我哪里做错了? -谢谢

【问题讨论】:

  • 嗨,亲爱的@Mario!我纠正了这一点。 -谢谢
  • 您是否看到错误,或者您只是没有看到应用的样式?
  • @Dan 我的用户控件是一个滚动查看器,它在其子项的每个所需侧显示一个动画箭头形状的按钮。当我应用样式时,箭头形按钮消失。 (我在设计时和运行时都没有收到任何错误。)
  • 你在哪里声明了 Style 标签?它是否包含在 MyUserControl 实例所在位置的分层祖先资源部分中?
  • @Mario 我会编辑问题并为您提供更大的图景。

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


【解决方案1】:

使用亲爱的@Mario Vernari 的说明,我发现问题是由于我用来创建用户控件的错误策略造成的。我想创建一个能够容纳其他一些的 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 类型的依赖属性。如果您直接设置其属性(如DP1),则通过这种方式创建的UserControl 可以正常工作。这绝对不是@Mario 告诉我的真正方式:

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

他补充说:

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

按照这个: http://www.codeproject.com/KB/WPF/WPFCustomControl.aspx ...

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

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

【讨论】:

    【解决方案2】:

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

    只是 - Style="{StaticResource MyUserControlStyle}"

    【讨论】:

    • 正如我所料,这对它没有影响。
    • @Varun:您提供的后一个示例只是第一个示例的简写。 ResourceKeyStaticResource 标记扩展的默认属性,因此您没有必须命名它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多