2009-08-06 8 views
3

Ich erstelle derzeit ein benutzerdefiniertes Steuerelement (basierend auf dem WPF DataGrid). Was ich tun möchte, ist, Standard-Styling auf dem Datagrid zu setzen. Zurzeit setze ich die Style-Eigenschaft, die funktioniert. Aber mein Problem tritt auf, wenn ich einen Stil erstelle, um FX zu ändern. die Hintergrundfarbe in den Hauptanwendungen app.xaml. Dann ist all mein "Standard" -Stil verloren und das DataGrid sieht alle Standard nur mit der Hintergrund-Eigenschaft aus.Erstellen eines Standardstils für benutzerdefiniertes Steuerelement

Ich habe versucht OverrideMetadata für jede der Eigenschaften im Grid, die ich einen Standardwert anwenden möchten, aber ohne Glück. Ich habe auch versucht, jede Eigenschaft im Konstruktor zu setzen, aber aufgrund der Eigenschaftspriorität werden die Stile aus der Hauptanwendung dann nie angewendet.

Irgendwelche Ideen?

Vielen Dank im Voraus

+0

Haben Sie versucht, die „BasedOn“ in Ihrem benutzerdefinierten Stil einstellen? –

+0

Nun, ich habe darüber nachgedacht, aber um das tun zu können, muss ich eine Eigenschaft in meinem Grid-Steuerelement erstellen, um den Standardstil zu erhalten, und dann in der App.xaml, wo ich meinen neuen Stil erstelle, verwende ihn mit BasedOn. Ich dachte nur, dass es eine bessere Lösung geben würde. Mit allen Steuerelementen von Drittanbietern können Sie einen neuen Stil erstellen und einige Eigenschaften festlegen, ohne den gesamten Stil erneut implementieren zu müssen. –

Antwort

4

Wenn Sie einen Stil ohne Wörterbuch Schlüssel erstellen, werden alle Objekte vom Typ Sie im Rahmen angeben Stil, der Sie Ihren Stil Wörterbuch importieren (wenn Sie es in einem Window.Resources angeben , es wird Spielraum für dieses Fenster haben ... wenn Sie es in App.xaml angeben ... erhalten Sie das Bild).

<Style TargetType="{x:Type Button}"> 
    <Setter Property="FontFamily" Value="Times New Roman" /> 
    <Setter Property="FontSize" Value="30" /> 
    <Setter Property="FontWeight" Value="Bold" /> 
    <Setter Property="Background" Value="#FFCA5132" /> 
    </Style> 

Dies wird ihnen alle den gleichen Stil geben.

Dies ist eine sehr mächtige Funktion. Es ermöglicht Ihnen, jedes Objekt, nicht nur UI-Elemente, zu stylen. Sie können beispielsweise eine Ihrer Dateneinheiten wie ein "Personen" -Objekt stylen, und wenn diese Elemente visuell verwendet werden, wie die Datenbindung einer Liste des Typs Person an eine ListView, werden alle von Ihnen so formatiert, wie Sie es angegeben haben nicht native UI-Elemente. So kann WPF über seine Steuerelemente "lookless" sein.

+0

Das Problem ist, dass der Standardstil, den ich bereits erstellt habe, im Ressourcenwörterbuch des Rasters ohne ist. Das Problem ist, dass in meinem Standard-Stil für ich habe: Jetzt, wenn ich einen neuen Stil in der App erstellen.XAML in meinem Haupt-App: Der Hintergrund wird nicht grün sein, weil der Standardstil im Ressourcenverzeichnis Gitter wird Vorrang haben –

+0

Es muss eine Möglichkeit geben, jeder Eigenschaft im Datagrid Standardwerte hinzuzufügen, so dass nicht alle meine Stile überschrieben werden, wenn ein neuer Stil für das Steuerelement festgelegt wird? –

+0

Sie müssten einen anderen Stil mit dem BasedOn-Attribut erstellen, das auf "DataGrid" festgelegt ist, und die wenigen Dinge überschreiben, die Sie für diese bestimmte Instanz überschreiben möchten. –

11

Haben Sie dies im static Konstruktor festgelegt?

DefaultStyleKeyProperty.OverrideMetadata(typeof(MyCustomType), new FrameworkPropertyMetadata(typeof(MyCustomType))); 

Ist auch der Schlüssel Ihrer Ressource Stil gleich Ihrem Typ der benutzerdefinierten Steuerung?

Es darf keine anderen Key-Sets haben, auch wenn TargetType auf Ihr Control gesetzt ist.

Die Versammlung sollte auch mit dem folgende Attribute gekennzeichnet werden:

[assembly: ThemeInfo(
    //where theme specific resource dictionaries are located 
    //(used if a resource is not found in the page, 
    // or application resource dictionaries) 
    ResourceDictionaryLocation.None, 

    //where the generic resource dictionary is located 
    //(used if a resource is not found in the page, 
    // app, or any theme specific resource dictionaries) 
    ResourceDictionaryLocation.SourceAssembly 
)] 
+0

Hey kek444 Ich habe das ja versucht, und wenn ich den Code einschließe, erscheint nichts, wenn das Gitter gerendert wird (nur ein leerer Platz, wo das Gitter sein sollte). Ich versuche derzeit, den BasedOn-benutzerdefinierten Stil zu arbeiten. –

+0

Zusätzliche Informationen in der Antwort zur Verfügung gestellt. –

+0

Ich hatte tatsächlich den Schlüssel nicht auf den Typ meiner Kontrolle eingestellt. Ich habe das korrigiert, aber ich bekomme immer noch einen leeren Bereich, wo die Kontrolle erscheinen sollte. Ich habe den Stil in der Datei themes/generic.xaml platziert und das Element [assembly: ThemeInfo (ResourceDictionaryLocation.SourceAssembly, ResourceDictionaryLocation.SourceAssembly)] zur Datei "assemblyinfo" hinzugefügt. Könnte das etwas damit zu tun haben? –