App.xaml 样式不能在 Usercontrol 中使用,为什么?

6

我在app.xaml中设置了一个文本块的样式,然后将其应用于应用程序中的各个文本块,这样可以正常工作。

但是,如果我将此样式应用于用户控件中的文本块,则会出现错误:“无法创建类型的实例”,为什么会出现这个问题?

<UserControl x:Class="Client.Usercontrols.MyButton"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" MinHeight="30" MinWidth="40"
DataContext="{Binding RelativeSource={RelativeSource Self}}">

<Button Width="Auto" HorizontalAlignment="Center">

    <Border CornerRadius="5" BorderThickness="1" BorderBrush="Transparent" >
        <Grid>
            <Image Name="tehImage" Source="{Binding ImageSource}" />
            <TextBlock Name="tehText" Text="{Binding Text}" 
                Style="{StaticResource ButtonText}" /> <-- This causes error
        </Grid>
    </Border>

</Button>

谢谢, Kohan

-- App.Xaml 代码 --

<Application x:Class="Client.App"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    StartupUri="Mainpage.xaml">
    <Application.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary Source="Styles/CascadingStyles.xaml" />
            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>
    </Application.Resources>
</Application>

-- 层叠样式表.Xaml --

 <Style TargetType="{x:Type TextBlock}" x:Key="ButtonText" >
    <Setter Property="FontSize" Value="10" />
    <Setter Property="VerticalAlignment" Value="Bottom" />
    <Setter Property="HorizontalAlignment" Value="Center" />
    <Setter Property="FontFamily" Value="Lucida Sans Unicode" />
    <Setter Property="Foreground" Value="#0F004E" />
 </Style>
3个回答

9
基本上,它无法找到 StaticResource 因为它不在您用户控件所在的文件中。UserControl.xaml 对 App.xaml 一无所知。
你应该使用 DynamicResource,这样它会在运行时应用。

1
我按照建议改为使用DynamicResource,它可以正常工作,如果我在<UserControl.Resources></..>中设置样式也可以正常工作。 只是出于好奇,为什么App.Config的范围不能覆盖UserControl,但可以覆盖页面或窗口中的所有控件? - 4imble
2
基本上,您必须将UserControl视为一个独立的实体。例如,它可以存在于不同的程序集中。自定义控件也是同样的道理。它们只知道您告诉它们的内容。理想情况下,您应该将样式放在ResourceDictionary中,并在需要它们的地方包含它们--App.xaml、您的用户控件等。这使得“换肤”或“主题化”变得更加容易--只需交换资源字典即可。 - Muad'Dib

5
之前的回答是完全错误的。您绝对可以在应用程序级别定义资源,并从UserControls中引用它们。事实上,这通常可以提高性能以防止资源重复。正如此页面中“静态资源查找行为”标题下所述,应用程序资源是第三个检查静态资源列表的位置。
我猜您可能有一个拼写错误或其他问题导致错误。您能发布app.xaml代码吗?

已添加所请求的代码,似乎很奇怪它作为普通资源会导致错误,但如果我将其分配给本地资源或使其动态化,则可以正常工作。 - 4imble
代码完全复制并且能够无错误地构建和运行。你对你所遇到的错误有更多细节吗? - Bryce Kahle
注意:我已经从UserControl中删除了绑定,因为我不想花时间实现这些属性。也许这就是问题的根源? - Bryce Kahle

0

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