50 votes

Styles au niveau de l'assembly / de niveau racine dans la bibliothèque de classes WPF

J'ai un C# (2008/.NET 3.5) la classe de la bibliothèque de l'assemblée qui prend en charge WPF (basé sur http://dotupdate.wordpress.com/2007/12/05/how-to-add-a-wpf-control-library-template-to-visual-c-express-2008/). J'ai créé plusieurs fenêtres, et je suis en train d'essayer de créer un style de jeu pour eux. Cependant, comme c'est une bibliothèque de classe (au lieu d'une application WPF), je n'ai pas une application.xaml (et de ses contenus Demande et à l'Application correspondante.Ressources) dans lequel stocker ces styles pour l'accès mondial.

Donc: Comment puis-je créer un haut-niveau de l'ensemble de définitions de style qui va être vu par tous les fichiers xaml dans l'assemblée, étant donné que je n'ai pas d'application.xaml (voir ci-dessus)? Et/ou il est possible d' ajouter un travail d'application.xaml pour une bibliothèque de classe?

Pour info, j'ai essayé de créer un ResourceDictionary dans un ResourceDictionary.fichier xaml, et l'inclure dans chaque fenêtre à l'intérieur d'une Fenêtre.Ressources de bloc". Qui s'est avéré pour résoudre le style des Boutons, etc... mais pas pour l'affichage de la Fenêtre. Je peux mettre " Style="{StaticResource MyWindowStyle}"' dans la Fenêtre d'ouverture du bloc, et il compile et s'affiche dans le VS la fenêtre de création d'amende, mais au cours d'une exécution, je reçois un parse exception (MyWindowStyle n'a pas pu être trouvé; je devine que Visual Studio voit le dictionnaire inclus après la ligne en question, mais la LCR n'a plus de choses de manière séquentielle et n'a donc pas chargé ResourceDictionary encore).


Merci pour les idées, mais toujours pas aller... apparemment une bibliothèque de classe ne prend PAS en charge le générique.xaml utilisation implicitement. J'ai ajouté des génériques.xaml pour mon projet de bibliothèque de classes et de définir son Action de Construire de la "Ressource". Il contient:

<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>

La fenêtre xaml que je veux utiliser le thème ressemble à ceci:

<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>

Bien que la VS la Conception de la fenêtre n'affiche pas la fenêtre à l'aide de la Mafenêtre style (c'est à dire fond noir), il compile fine et démarre. Toutefois, lorsque l'application contenant cette bibliothèque de classe qui fait un appel que les causes de cette fenêtre à l'écran, j'obtiens un XamlParseException:

Cannot find resource named '{MyWindow}'.

J'ai aussi essayé en laissant le paramètre de Style, pour voir si la fenêtre serait d'utiliser le style par défaut (et j'ai essayé à la fois avec le x:Clé générique.xaml inclus et sans). Pas d'erreurs, mais rien de défini dans le générique.xaml n'a pas montré non plus.

Suis-je en train de faire quelque chose de mal ici, ou d'autres idées sur la façon dont on pourrait l'autoriser pour le commun des styles personnalisés pour être utilisé sur une Fenêtre (c'est à dire, sans avoir à définir les styles dans chaque Fenêtre du xaml) -- avec l'avertissement que ce n'est PAS une application?

15voto

Jab Points 8901

Essayez d'ajouter

 Style={DynamicResource MyStyle}
 

Vous ne pouvez pas utiliser un StaticResource dans ce cas.

14voto

Cameron MacFarland Points 27240

Cela sonne comme un travail de la thématisation.

  1. Ajouter un /themes/generic.xaml ResourceDictionary à votre projet.
  2. Ajoutez ce qui suit à AssemblyInfo.cs: [assembly: ThemeInfo(ResourceDictionaryLocation.None, ResourceDictionaryLocation.SourceAssembly)]
  3. ?
  4. Le Profit!

Toutes les ressources que vous ajoutez à générique sera utilisé par tous les contrôles. Vous pouvez également faire profil des thèmes spécifiques (Luna, Aero etc.) en incluant un ResourceDictionary fichier avec le bon nom du thème dans l' themes répertoire.

Voici un lien pour plus d'info: Créer et appliquer des thèmes personnalisés

3voto

Muad'Dib Points 14260

Si vous n'avez pas de fichier app.xaml, vous pouvez toujours le charger dans les ressources de niveau application, mais vous devez écrire du code (pas xaml) pour le faire, semblable à ceci ...

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

Consultez ce site pour un exemple: http://ascendedguard.com/2007/08/one-of-nice-features-about-wpf-is-how.html

0voto

Muad'Dib Points 14260

si vous le chargez dans Window.Resource, le dictionnaire n'est disponible que pour les enfants de cette fenêtre. Vous devez l'avoir disponible pour la fenêtre et ses enfants.

Essayez de le charger dans votre fichier app.xaml. Cela devrait en faire une ressource de niveau application, pas une ressource de niveau fenêtre.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X