为什么我的WPF样式无法生效?

6

尝试在app.xaml中应用样式。我的app.xaml如下:

<Application x:Class="TestApp.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <Application.Resources>
        <Style x:Key="TestStyle" TargetType="Button">
            <Setter Property="Background" Value="Red"/>
        </Style>
    </Application.Resources>
</Application>
<Button Content="Click Me!" Style="{StaticResource TestStyle}" />

在设计师中一切看起来都很正常,但当我运行代码时它失败并显示以下错误信息:
Provide value on 'System.Windows.StaticResourceExtension' threw an exception.

我已经盯着这个问题很久了,但是找不到问题所在!

编辑

似乎与整个应用程序有关。如果我将我的代码复制到另一个新项目中,它可以正常工作。唯一的区别是加载窗口时使用了“StartupUri = MainWindow.xaml”。在不起作用的那个中,我在App.Startup期间加载窗口,如下所示:

protected override void OnStartup(StartupEventArgs e)
{
    base.OnStartup(e);
    new TestWindow().Show();
}

解决方案

找到了问题所在——我没有调用InitializeComponent。现在样式在最终产品中起作用,但在设计师中不起作用。我将另外提出一个问题。

4个回答

6
解决方法:只需为应用程序对象定义一个名称:

< Application x:Name="App" ...

对我很有用!


2
这很有趣,因为它确实有效!你知道为什么吗?对我来说没有任何意义… - walther
非常迷人! - dotNET

1
根据您的编辑:如果在原始的xaml中有StartupUri="MainWindow.xaml",但是(如您的代码片段所示)实际上您有一个名为TestWindow.xaml的文件,那么这可能是问题所在!请尝试在原始项目中将其更改为StartupUri="TestWindow.xaml"...。

0

试试这个...

<Style x:Key="TestStyle" TargetType="{x:Type Button}">
   <Setter Property="Background" Value="Red"/>
</Style>

通常在WPF中,您希望您的TargetType采用以下形式:{x:Type ...}
而在Silverlight中,则应使用TargetType="Button"

两者在运行时是等效的。使用x:Type会增加一些编译时检查。 - John Bowen

0

你可以尝试使用{DynamicResource TestStyle}。也许当你将其应用于按钮时,TestStyle还没有被创建。


运行了,但是样式没有应用。 - Bill Jeeves

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