【问题标题】:Weird behavior with styles in XAMLXAML 中样式的奇怪行为
【发布时间】:2012-05-21 23:41:17
【问题描述】:

我不明白为什么会这样。我在 WPF 中有一个简单的应用程序。这个应用程序有一个窗口,并且在 App.xaml 中定义了一种样式,它改变了所有按钮的样式:

<Application x:Class="PruebasDesk.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             StartupUri="Window1.xaml">
    <Application.Resources>
        <Style TargetType="{x:Type Button}">
            <Setter Property="Height" Value="23"></Setter>
            <Setter Property="Width" Value="75"></Setter>
            <Setter Property="Background" Value="DarkCyan"></Setter>
        </Style>
    </Application.Resources>
</Application>

这很好用,所有按钮都有样式。现在,问题来了。如果我不使用 StartupUri 属性来启动应用程序,而是使用 OnStartup 方法来启动它:

public partial class App : Application
    {
        protected override void OnStartup(StartupEventArgs e)
        {
            Window1 win1 = new Window1();
            win1.Show();
        }
    }

应用程序的按钮不会应用在 App.xaml 中定义的按钮样式。但是...如果我向 App.xaml 添加另一种样式,如下所示:

<Application x:Class="PruebasDesk.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             >
    <Application.Resources>
        <Style TargetType="{x:Type Button}">
            <Setter Property="Height" Value="23"></Setter>
            <Setter Property="Width" Value="75"></Setter>
            <Setter Property="Background" Value="DarkCyan"></Setter>
        </Style>
        <Style TargetType="{x:Type TextBox}">
            <Setter Property="Height" Value="23"></Setter>
            <Setter Property="Width" Value="180"></Setter>
            <Setter Property="Background" Value="Azure"></Setter>
        </Style>
    </Application.Resources>
</Application>

然后按钮应用样式!!!这对我来说真的很奇怪。有谁知道我是否遗漏了什么?

【问题讨论】:

标签: wpf xaml


【解决方案1】:

我不能肯定地告诉你为什么会发生这种行为,但我可以告诉你,最佳实践会引导你远离以这种方式使用 App.xaml。我认为更好的做法是仅在 app.xaml 中合并您的资源字典。存储实际样式是创建难以管理的项目的好方法。

创建一个新的 ResourceDictionary 文件并添加这些样式。在添加更多字典时合并字典。

  <Application.Resources>
    <ResourceDictionary>
      <ResourceDictionary.MergedDictionaries>
        <ResourceDictionary Source="Common.xaml"/>
      </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
  </Application.Resources>

或者,您可以挂钩到事件Startup(app.xaml:Startup="App_Startup")而不覆盖OnStartup。这将适用于您定义的 App.xaml 资源设置。这可能是时间问题。

【讨论】:

  • 好吧,看来是个bug。正如您所指出的,资源字典避免了这个问题,但是当您尝试一些概念证明并快速添加一些样式时,这个错误可能会让您发疯:) ... +1 给 RichardOD 以获取链接。