2016-06-10 25 views
0

Ich versuche, ein einheitliches Aussehen und Gefühl über Elemente in meiner WPF-Anwendung zu erhalten, und gleichzeitig möchte ich eine modifizierte TextBox erstellen. Wenn ich das tue, werden Formatvorlagen, die ich auf Anwendungsebene für TextBox definiere, jedoch nicht auf die Klasse angewendet, die ich erstellte, obwohl das Format, das für mein benutzerdefiniertes Steuerelement erstellt wird, die BasedOn-Eigenschaft verwendet.Benutzerdefiniertes Steuerelement erbt nicht die Stile der Eltern

Gibt es etwas, das ich vermisse, was dazu führt, dass sich das anders verhält als erwartet?

ich das Thema in einem brandneuen WPF-Projekt in VS2010 mit diesem Setup reproduziert:

C# Code:

public class CustomTextBox : TextBox 
{ 
    static CustomTextBox() { 
     DefaultStyleKeyProperty.OverrideMetadata(typeof(CustomTextBox), new FrameworkPropertyMetadata(typeof(CustomTextBox))); 
    } 
} 

XAML in Themes\Generic.xaml:

<Style TargetType="{x:Type local:CustomTextBox}" BasedOn="{StaticResource {x:Type TextBox}}"/> 

XAML in App.xaml:

<Application.Resources> 
    <Style TargetType="TextBox"> 
     <Setter Property="Background" Value="Red"/> 
    </Style> 
</Application.Resources> 

jedoch im Designer und wenn ich die app laufen, die CustomTextBox fällt zurück onthe Standardstil für das Textfeld stattdessen einen roten Hintergrund zu haben, obwohl the documentation for the BasedOn property legt nahe, dass meine abgeleiteten Klasse dieses Styling haben sollte ...

Es gibt verschiedene Möglichkeiten, Stile in WPF zu erweitern oder zu vererben. Stile können über diese Eigenschaft auf anderen Stilen basieren. Wenn Sie diese Eigenschaft verwenden, erbt der neue Stil die Werte des ursprünglichen Stils, die im neuen Stil nicht explizit neu definiert werden.

...

Hinweis: Wenn Sie einen Stil mit einem Target Eigenschaft erstellen und auf einem anderen Stil stützen, die auch eine Target Eigenschaft definiert, muss der Zieltyp des abgeleiteten Stil die gleiche sein wie oder aus dem Typ des Basisstils abgeleitet werden.

Antwort

0

Kurze Antwort: Ihr Stil auf einem Static basiert

<Style TargetType="{x:Type local:CustomTextBox}" BasedOn="{StaticResource {x:Type TextBox}}"/> 

Wenn Sie dies tun, Sie ändern nicht die Static

<Style TargetType="TextBox"> 
    <Setter Property="Background" Value="Red"/> 
</Style> 

So ist CustomTextBox nicht die roten erben soll Hintergrund.