Frage

Ich habe eine C # (2008 / .NET 3.5) Klassenbibliothek Assembly, die WPF unterstützt (basierend auf dieser Artikel ).
ich habe mehrere Fenster erstellt, und jetzt bin versucht zu schaffen für sie einen gemeinsamen Stil. Da es jedoch eine Klassenbibliothek (anstelle einer WPF-Anwendung) ist, habe ich nicht eine app.xaml haben (und die darin enthaltenen Anwendungs- und entsprechenden Application.Resources), in der diese Stile für den globalen Zugriff zu speichern.

So: Wie kann ich einen Top-Level-Satz von Formatdefinitionen erstellen, die von allen XAML-Dateien in der Baugruppe gesehen werden, gegeben, dass ich nicht app.xaml ( siehe oben) ? Und / oder ist es möglich, in ein app.xaml zu einer Klassenbibliothek zu arbeiten?

FYI, ich habe versucht ein Resource in einer ResourceDictionary.xaml-Datei zu erstellen, und es in jedem Fenster innerhalb eines „Window.Resources“ -Block. Das erwies sich das Styling der Tasten zu lösen, etc ... aber nicht für den umschließenden Fenster. Ich kann Style="{StaticResource MyWindowStyle}" im Fenster des Öffnungsblock gesetzt, und es kompiliert und zeigt in der VS Design-Fenster in Ordnung, aber während der tatsächlichen Laufzeit erhalte ich eine Parse-Ausnahme (MyWindowStyle nicht gefunden werden konnte, ich bin zu raten, Visual Studio sieht das Wörterbuch enthalten nach die Linie in Frage, aber die CRL tut mehr sequentiell Dinge und deshalb hat die Resource noch nicht geladen).


Danke für die Ideen, aber immer noch nicht gehen ... anscheinend eine Klassenbibliothek unterstützt nicht die generic.xaml Nutzung implizit. Ich habe generic.xaml mein Klassenbibliotheksprojekt und legen Sie die Build Action auf „Ressource“. Es enthält:

<ResourceDictionary 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <Style TargetType="{x:Type Window}" x:Key="MyWindow">
        <Setter Property="Background" Value="Black"/>
    </Style>
</ResourceDictionary>

Das Fenster XAML, die ich benutzt haben wollen sieht das Thema wie folgt:

<Window x:Class="MyAssembly.ConfigureGenericButtons"
    x:ClassModifier="internal"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Style="{StaticResource MyWindow}"
    Title="ConfigureGenericButtons">
...Buttons, etc...
</Window>

Obwohl das VS Design-Fenster nicht das Fenster nicht zeigt die MyWindow Art (zB schwarzer Hintergrund) verwendet wird, kompiliert es fein und startet. Wenn jedoch die App diese Klassenbibliothek einen Aufruf enthält, die dieses Fenster verursacht anzuzeigen, ich XamlParseException bekommen:

  

Kann nicht Ressource finden namens '{MyWindow}'.

Ich habe auch versucht, den Style Parameter auslassen, um zu sehen, ob das Fenster den Stil standardmäßig verwenden würde (und ich versuchte, dass beide mit dem x: Key in generic.xaml enthalten und ohne). Keine Fehler, aber alles, was in der generic.xaml definiert haben auch nicht angezeigt.

Mache ich etwas falsch hier, oder andere Ideen, wie man für gemeinsame benutzerdefinierte Stile erlauben könnte auf einem Fenster verwendet werden (dh sie haben nicht die Stile der XAML in jedem Fenster definieren) - mit dem Vorbehalt, dass diese NICHT ist eine Anwendung?

War es hilfreich?

Lösung

Versuchen Sie das Hinzufügen

Style={DynamicResource MyStyle}

Sie können keine Static in diesem Fall verwendet werden.

Andere Tipps

Das klingt wie ein Job für Theming.

  1. Fügen Sie ein /themes/generic.xaml Resource zu Ihrem Projekt.
  2. Fügen Sie Folgendes AssemblyInfo.cs: [assembly: ThemeInfo(ResourceDictionaryLocation.None, ResourceDictionaryLocation.SourceAssembly)]
  3. ?
  4. Profit!

Jede Ressourcen, die Sie zu generic hinzufügen wird von allen Steuerungen verwendet werden. Sie können auch Profil spezifische Themen machen (Luna, Aero etc.) durch eine Resource Datei mit den richtigen Thema Namen in dem themes Verzeichnis enthält.

Hier ist ein Link zu mehr Informationen: erstellen und benutzerdefinierte Themen gelten

Wenn Sie eine app.xaml nicht haben, können Sie es in die appplication-Level-Ressourcen laden, aber Sie haben den Code schreiben (nicht XAML), es zu tun, ähnlich wie dies ...

void LoadIt()
{
     ResourceDictionary MyResourceDictionary = new ResourceDictionary();
     MyResourceDictionary.Source = new Uri("MyResources.xaml", UriKind.Relative);
     App.Current.Resources.MergedDictionaries.Add(  MyResourceDictionary )
}

prüfen, diese Website für ein Beispiel: http: // ascendedguard .com / 2007/08 / one-of-schön-Features-about-wpf-is-how.html

Dr. WPF (oder die Person, die früher als Dr. WPF bekannt) hat eine große post zu diesem Thema.

Hier ist ein Auszug aus dem Amt, wo sie das Anwendungsobjekt erstellen und Ressourcen hinzufügen:

if (Application.Current == null)
{
    // create the Application object
    new Application();

    // merge in your application resources
    Application.Current.Resources.MergedDictionaries.Add(
        Application.LoadComponent(
            new Uri("MyLibrary;component/Resources/MyResourceDictionary.xaml",
            UriKind.Relative)) as ResourceDictionary);
}

Da meine Montage über Interop gehostet ich die Einstellung der Shutdown hinzufügen wie folgt hatte und Herunterfahren, wenn Sie fertig:

new Application() { ShutdownMode = ShutdownMode.OnExplicitShutdown };

Es funktionierte wie ein Charme.

, wenn Sie es in Window.Resource laden, ist das Wörterbuch nur für die Kinder dieses Fensters zur Verfügung. Sie müssen es für das Fenster und seine Kinder zur Verfügung haben.

Versuchen Sie es in Ihrer app.xaml Datei zu laden. Das sollte ihm eine Anwendungsebene Ressource machen, keine Fensterebene Ressource.

So nach viel Zeit verbringen ich diese endlich herausgefunden. Hier ist, wie:

  1. In WPF Bibliothek steuert, fügen Sie einen neuen Ordner mit dem Namen themes.
  2. Im Inneren des themes Ordner, fügen Sie ein Ressourcenverzeichnis namens generic.xaml.
  3. Innerhalb generic.xaml, fügen Sie Ihre Ressource mit folgenden Syntax:

    <SolidColorBrush x:Key="{ComponentResourceKey {x:Type local:UserControl1}, MyEllipseBrush}" Color="Blue" />
    
  4. In Ihrer Kontrolle, verwenden Sie die folgende Syntax auf diese Ressource zuzugreifen:

    Background="{StaticResource {ComponentResourceKey {x:Type local:UserControl1}, MyEllipseBrush}}"
    

Dinge zu beachten:

  1. Schritt 1 und 2 werden in der Regel automatisch für Sie von Visual Studio gemacht, wenn Sie eine neue WPF-Steuerelemente Bibliothek erstellen.
  2. Ich verstehe nicht ganz den Zweck der ComponentResourceKey ersten Parameter, aber es ist nicht erforderlich. Verwenden Sie den Namen der Steuerung, die diese Ressource verbraucht.
  3. Designer Visual Studio wurde der Lage sein, die Ressource nicht in meinem Fall zu lokalisieren. Es könnte ein Cache-Problem sein, ich bin mir nicht sicher. Zur Laufzeit jedoch funktioniert es ordentlich.
  4. Sie können mehr Informationen über diese Syntax in diesem MSDN-Artikel .

Hope dies macht einige Leben einfacher.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top