【问题标题】:Style Inheritance with UserControl使用 UserControl 进行样式继承
【发布时间】:2014-08-18 10:18:53
【问题描述】:

我正在尝试自定义用户控件的样式,继承其样式并为其添加一些额外的样式。我做了一个小项目来试试这个。假设我有一个名为 UserControl1 的用户控件(它包含的内容无关紧要 - 在我的示例项目中它是空的)。

我在我的MainWindow 中使用它如下:

<Window x:Class="WpfStyleInheritance.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:WpfStyleInheritance"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <local:UserControl1>
            <local:UserControl1.Style>
                <Style TargetType="{x:Type local:UserControl1}" BasedOn="{x:Type local:UserControl1}">
                    <Setter Property="Margin" Value="0" />
                </Style>
            </local:UserControl1.Style>
        </local:UserControl1>
    </Grid>
</Window>

BasedOn 部分,我收到了错误:

无法分配指定的值。应为以下类型:“样式”。

如果我将其更改为 BasedOn="{StaticResource {x:Type local:UserControl1}}",则会收到错误消息:

无法解析资源“{x:Type local:UserControl1}”。

我怎样才能让它工作并从此过上幸福的生活?

编辑:正如我在此处的答案的 cmets 中发布的那样,如果我走 StaticResource 路线并运行,我会收到带有消息的 XamlParseException:

找不到名为“WpfStyleInheritance.UserControl1”的资源。资源名称区分大小写。

附加信息:如果我将 MainWindow 标记中的所有 local:UserControl1 实例替换为 Button,则效果非常好。问题出在用户控件上。

编辑 2:如果我在 UserControl 中添加样式,问题仍然存在:

<UserControl.Style>
    <Style TargetType="UserControl">
        <Setter Property="Height" Value="0" />
    </Style>
</UserControl.Style>

【问题讨论】:

    标签: c# wpf user-controls


    【解决方案1】:

    BasedOn 语法不正确。应该是:

    BasedOn="{StaticResource {x:Type local:UserControl1}}"
    

    即使您遇到设计错误,也请尝试重新编译您的代码。确保添加的命名空间正确映射到您的 UserControl。

    另外,请确保 MainWindowUserControl1 位于同一个程序集中。

    如果它们位于不同的程序集中,则必须在命名空间声明中指定程序集名称:

    xmlns:local="clr-namespace:WpfStyleInheritance;assembly=AssemblyName"
    

    更新

    如果您没有为 UserControl1 定义任何默认样式,则不需要使用 BasedOn,因为您的 UserControl 不存在默认样式.这就是您遇到异常的原因。

    去掉 BasedOn 就可以正常工作了。


    您在 XAML 中定义的资源不是默认样式,而是 UserControl 的本地样式,如果您在 MainWindow 中定义另一个本地资源,它将被覆盖。

    如果您想要 UserControl1 的默认样式,请在 Application resources 下声明,即在 App.xaml 中。

    <Application.Resources>
       <Style TargetType="{x:Type local:UserControl1}">
          <Setter Property="Height" Value="0" />
       </Style>
    </Application.Resources>
    

    现在在 MainWindow.xaml 中,这将正常工作:

    <local:UserControl1>
        <local:UserControl1.Style>
            <Style TargetType="{x:Type local:UserControl1}"
                   BasedOn="{StaticResource {x:Type local:UserControl1}}">
                <Setter Property="Margin" Value="0" />
            </Style>
        </local:UserControl1.Style>
    </local:UserControl1>
    

    【讨论】:

    • 我试过了,正如我在问题中解释的那样。如果我运行,我会得到 XamlParseException
    • 你能发布 XamlParseException 的内部异常吗?
    • 找不到名为“WpfStyleInheritance.UserControl1”的资源。资源名称区分大小写。
    • 你能发布 UserControl1 的代码吗?很可能程序集不同或名称不正确。
    • 它只是一个空的 UserControl,你在 Add New Item 之后得到的那种。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-27
    • 1970-01-01
    • 2011-12-04
    • 2023-03-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多