2017-09-19 5 views
1

Dieses Problem hat mich einen ganzen Tag lang verrückt gemacht! Bitte helfen Sie!WPF: Stil wird nicht auf Fensterunterklasse angewendet

In einer leeren Testanwendung habe ich eine Unterklasse von System.Windows.Window erstellt und einen Stil darauf in einem Ressourcenwörterbuch angewendet, und es funktionierte einwandfrei.

Jetzt mache ich das gleiche in meiner tatsächlichen App, und alles baut und läuft - aber der Stil wird nicht auf das Fenster angewendet!

Ich verengte die Dinge auf den Versuch, den Fensterhintergrund rot zu machen ... das funktioniert einfach nicht und ich ziehe Haare aus!

PropertiesWindowBase.cs:

using System.Windows; 

namespace MyApp.Client.UI.Windows 
{ 
    public class PropertiesWindowBase : Window 
    { 
    } 
} 

styles.xml:

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
       xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
       xmlns:windows="clr-namespace:MyApp.Client.UI.Windows"> 
<Style TargetType="{x:Type windows:PropertiesWindowBase}"> 
    <Setter Property="Background" Value="Red"/> 
</Style> 

App.xml:

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

App.xaml.cs:

using System.Globalization; 
using System.Threading; 
using System.Windows; 

namespace MyApp.Client 
{ 
    /// <summary> 
    /// Interaction logic for App.xaml 
    /// </summary> 
    public partial class App : Application 
    { 
     private void App_OnStartup(object sender, StartupEventArgs e) 
     { 
      var window = new CaseUserPropertiesWindow();// { DataContext = vm }; 
      window.ShowDialog(); 
      return; 
     } 
    } 
} 

CaseUserPropertiesWindow.xaml:

<windows:PropertiesWindowBase x:Class="MyApp.Client.UI.Windows.CaseUserPropertiesWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
    xmlns:windows="clr-namespace:MyApp.Client.UI.Windows" 
    mc:Ignorable="d" 
    Title="CaseUserPropertiesWindow" Height="300" Width="300"> 
</windows:PropertiesWindowBase> 

CaseUserPropertiesWindow.xaml.cs:

{ 
    /// <summary> 
    /// Interaction logic for CaseUserPropertiesWindow.xaml 
    /// </summary> 
    public partial class CaseUserPropertiesWindow : PropertiesWindowBase 
    { 
     public CaseUserPropertiesWindow() 
     { 
      InitializeComponent(); 
     } 
    } 
} 
+2

Target bezeichnet den meisten abgeleiteten Typ. Daher sollte CaseUserPropertiesWindow anstelle von PropertiesWindowBase sein. Möglicherweise verfügen Sie über einen Style für CaseUserPropertiesWindow, der den Style für PropertiesWindowBase auf BasedOn basiert. – Clemens

+0

DANKE @Clemens. Ich denke, ich verstehe es jetzt endlich: So wird ein Stil nur auf den abgeleiteten Typ angewendet, nicht auf den Basistyp - es sei denn, die Basisklasse hat einen statischen Konstruktor, der DefaultStyleKeyProperty.OverrideMetadata aufruft. Und dann muss der Stil in Themes \ Generic.xaml sein? habe ich recht? – user884248

+0

Möchten Sie dies als eine Antwort schreiben, so dass ich dies als eine Lösung wählen kann? Oder sollte ich? – user884248

Antwort

1

TargetType bezeichnet den meisten abgeleiteten Typ. Daher sollte es CaseUserPropertiesWindow statt PropertiesWindowBase sein.

Sie können einen Style für CaseUserPropertiesWindow haben, die BasedOn den Stil für PropertiesWindowBase ist:

<ResourceDictionary ...> 
    <Style TargetType="windows:PropertiesWindowBase"> 
     <Setter Property="Background" Value="Red"/> 
    </Style> 
</ResourceDictionary> 

... 

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

    <Style TargetType="local:CaseUserPropertiesWindow" 
      BasedOn="{StaticResource {x:Type windows:PropertiesWindowBase}}"> 
    </ResourceDictionary> 
</Application.Resources> 
+0

Danke. Genau das habe ich gesucht. – user884248

Verwandte Themen