Override Standard Theme in App.xaml

后端 未结 2 2063
难免孤独
难免孤独 2021-02-15 22:11

I am using the standard WPF theme Aero.NormalColor.xaml. And it works very well. However for the whole application, I would like to override the Foreground colo

相关标签:
2条回答
  • 2021-02-15 22:25

    I had the same problem and tried Oskar's approach. Though, it caused some strange behaviour. Particularly, the styles did not apply to some controls, while applying to other controls of the same type. And I could not find any major differences between these controls.

    I continued searching for the solution and I found one here: http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/91718816-8674-4ad8-a3c8-ae283bebe224/

    It is still not perfect and clear, but it works, at least for me.

    In brief, you can get the idea from the following code:

    <Application.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary>
                    <ResourceDictionary.MergedDictionaries>
                        <ResourceDictionary Source="/PresentationFramework.Aero, Version=3.0.0.0,
            Culture=neutral, PublicKeyToken=31bf3856ad364e35,
            ProcessorArchitecture=MSIL;component/themes/Aero.NormalColor.xaml" />
                    </ResourceDictionary.MergedDictionaries>
                    <Style x:Key="ExtendedTextBoxStyle" TargetType="{x:Type TextBox}" BasedOn="{StaticResource {x:Type TextBox}}">
                        <Setter Property="Foreground" Value="Red" />
                    </Style>
                </ResourceDictionary>
            </ResourceDictionary.MergedDictionaries>
            <Style TargetType="{x:Type TextBox}" BasedOn="{StaticResource ExtendedTextBoxStyle}" />
        </ResourceDictionary>
    </Application.Resources>
    

    For maintainability and readability these nested ResourceDictionary objects could go to separate XAML files.

    0 讨论(0)
  • 2021-02-15 22:39

    I think you can add the Style to a ResourceDictionary and merging that with the Aero theme like this:

    <Application.Resources>
      <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
          <ResourceDictionary Source="/PresentationFramework.Aero, Version=3.0.0.0,
            Culture=neutral, PublicKeyToken=31bf3856ad364e35,
            ProcessorArchitecture=MSIL;component/themes/Aero.NormalColor.xaml">
          </ResourceDictionary>
    
          <!-- Adding the style to a resource dictionary -->
          <ResourceDictionary>
            <Style TargetType="TextBox" BasedOn="{StaticResource {x:Type TextBox}}">
              <Setter Property="Foreground" Value="Red" />
            </Style>
          </ResourceDictionary>
    
        </ResourceDictionary.MergedDictionaries>
      </ResourceDictionary>
    </Application.Resources>
    

    This should give ALL your textboxes red foreground color without having to explicitly specify that on each window and user control.

    0 讨论(0)
提交回复
热议问题