WPF UserControl应用样式出现问题

5

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

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

我错在哪里了? -谢谢

你是否看到了错误,还是只是没有看到应用的样式? - Dan Puzey
@Dan 我的用户控件是一个滚动查看器,它在其子元素的每个所需侧面显示一个动画箭头形状的按钮。当我应用样式时,箭头形状的按钮会消失。(我在设计时和运行时都没有收到任何错误提示。) - Mehdi
@Mario 我会编辑问题并给你更全面的图片。 - Mehdi
你在示例中的代码是正确的。我只是复制了它,它可以运行。 - Em1
@Mario,我在网上找到了一些关于你的信息,但是我没有找到你的电子邮件。请发送电子邮件给我,以便我可以将完整的源代码发送给你。 - Mehdi
显示剩余3条评论
2个回答

5

根据亲爱的@Mario Vernari的指示,我发现问题是由于我使用的错误策略来创建我的用户控件所致。我想创建一个能够容纳其他一些用户控件的用户控件。所以我试了这个方法:

<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类)派生出我们的无外观控件。您可以查看这个这个来掌握细节。

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


0
你正在使用 Style="{StaticResource ResourceKey=MyUserControlStyle}"
只需要这样 - Style="{StaticResource MyUserControlStyle}"

正如我所预料的那样,这对它没有任何影响。 - Mehdi
3
你提供的后一个示例仅是第一个示例的速记方式。 ResourceKeyStaticResource 标记扩展的默认属性,因此您无需给它命名。 - Dan Puzey

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接