web-dev-qa-db-fra.com

Ajouter ResourceDictionary à la bibliothèque de classes

J'ai créé une bibliothèque de classes contenant WPF Windows et certains contrôles utilisateur hérités de mes classes c #, qui m'aide à personnaliser certains contrôles wpf.

Maintenant, je veux ajouter ResourceDictionary, pour m'aider à partager les styles entre mes classes wpf. C'est possible?

THX.


EDIT: fichier de dictionnaire de ressources Situé dans le projet MY.WpfPresentation.Main (nommé Styles.xaml):

<ResourceDictionary xmlns="http://schemas.Microsoft.com/winfx/2006/xaml/presentation"
                xmlns:x="http://schemas.Microsoft.com/winfx/2006/xaml"
                xmlns:dxg="http://schemas.devexpress.com/winfx/2008/xaml/grid"
                xmlns:dxgt="http://schemas.devexpress.com/winfx/2008/xaml/grid/themekeys"
                xmlns:MYNetMisc="clr-namespace:MY.Net.Misc;Assembly=MY.Net"
                >
    <Style x:Key="customRowStyle" BasedOn="{StaticResource {dxgt:GridRowThemeKey ResourceKey=RowStyle}}" TargetType="{x:Type dxg:GridRowContent}">
        <Setter Property="Foreground" Value="{Binding Path=DataContext.balance, Converter={MYNetMisc:BalanceToColor OnlyNegative=false}}" />
    </Style>
</ResourceDictionary>

en l'utilisant:

<MYNetPresentation:frmDockBase.Resources>       
    <ResourceDictionary x:Key="style">
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="pack://application:,,,/MY.WpfPresentation.Main;component/Styles.xaml" />
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
    <DataTemplate x:Key="TabTemplate">
        <dxlc:LayoutControl Padding="0" ScrollBars="None" Background="Transparent">
            <Image Source="/Images/Icons/table-32x32.png" Width="12" Height="12" />
            <TextBlock Text="{Binding}" HorizontalAlignment="Left" VerticalAlignment="Center" />
        </dxlc:LayoutControl>
    </DataTemplate>

</MYNetPresentation:frmDockBase.Resources>
20
davor

créer un dictionnaire de ressources comme celui-ci

<ResourceDictionary xmlns="http://schemas.Microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.Microsoft.com/winfx/2006/xaml">

  <ResourceDictionary>
    <ResourceDictionary.MergedDictionaries>
      <!-- Common base theme -->
      <ResourceDictionary Source="pack://application:,,,/Another.AssemblyName;component/YourResDictionaryFolder/OtherStyles.xaml" />
      <ResourceDictionary Source="pack://application:,,,/Another.AssemblyName;component/YourResDictionaryFolder/AnotherStyles.xaml" />
    </ResourceDictionary.MergedDictionaries>
  </ResourceDictionary>

  <!-- store here your styles -->

</ResourceDictionary>

et vous pouvez le mettre où vous voulez

<Window x:Class="DragMoveForms.Window2"
        xmlns="http://schemas.Microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.Microsoft.com/winfx/2006/xaml"
        Title="Window2"
        Height="300"
        Width="300">

  <Window.Resources>
    <ResourceDictionary Source="pack://application:,,,/Your.Base.AssemblyName;component/YourResDictionaryFolder/Dictionary1.xaml" />
  </Window.Resources>

  <Grid>

  </Grid>
</Window>
26
punker76

La réponse de @ punker76 est excellente et m'a beaucoup aidée, mais il convient d'ajouter que si vous créez un fichier vide et y ajoutez une balise de ressource, vous devez également accéder à la propriété de fichier, définissez BuildAction à Resource, Copier vers ... vers Ne pas copier et effacer la propriété CustomTool si elle est définie.

12
Chris W.

À mon avis, la question concerne l'ajout d'un fichier de dictionnaire de ressources WPF à un projet de bibliothèque de classes. La réponse est que vous ne pouvez pas le faire pour classic Bibliothèque de classes , mais pour WPF Application project, Bibliothèque de contrôles personnalisés WPF project ou un WPF User Control Library . Pour ces types de projets, vous pouvez ajouter un nouveau dictionnaire de ressources (WPF), option disponible en ajoutant un nouvel élément au projet.

À mon avis, le titre de la question et la question elle-même ne correspondent pas à la réponse acceptée.

10
XMight

Pour transformer un projet de bibliothèque classique en projet de bibliothèque WPF (afin d'ajouter UserControls, Windows, ResourcesDictionaries, etc.), vous pouvez ajouter le code XML suivant dans le fichier .csproj du premier nœud PropertyGroup:

<ProjectTypeGuids>{60dc8134-eba5-43b8-bcc9-bb4bc16c2548};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>

Exemple complet:

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="14.0" DefaultTargets="Build" xmlns="http://schemas.Microsoft.com/developer/msbuild/2003">
  <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
    <PropertyGroup>
      <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
      <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
      <ProjectGuid>{50E8AAEA-5CED-46BE-AC9A-B7EEF9F5D4C9}</ProjectGuid>
      <OutputType>Library</OutputType>
      <AppDesignerFolder>Properties</AppDesignerFolder>
      <RootNamespace>WpfApplication2</RootNamespace>
      <AssemblyName>WpfApplication2</AssemblyName>
      <TargetFrameworkVersion>v4.6.1</TargetFrameworkVersion>
      <FileAlignment>512</FileAlignment>
      <ProjectTypeGuids>{60dc8134-eba5-43b8-bcc9-bb4bc16c2548};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
      <WarningLevel>4</WarningLevel>
      <AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
      <TargetFrameworkProfile />
    </PropertyGroup>
    <!-- ... -->    
8
nmariot

Depuis que je ne peux pas encore commenter mais j'ai utilisé cette réponse deux fois maintenant:

Pour ajouter à la réponse de nmariot: 


Astuce 1

pour accéder au fichier .csproj à partir de visual studio 

clic droit sur le projet -> cliquez sur 'décharger le projet'

clic droit sur le projet [à l'état non chargé] -> cliquez sur "modifier" nomfichier.csproj "

Astuce 2

pour éviter les avertissements d'erreur une fois le dictionnaire de ressources ajouté:

ajouter une référence à System.Xaml

1
Declan Taylor

Oui. Vous pouvez ajouter un ResourceDictionary directement à votre projet.

Lorsque vous voulez l'utiliser, vous pouvez le fusionner dans le code XAML à l'aide de MergedDictionaries pour "fusionner" cette version autonome ResourceDictionary dans les ressources du type (par exemple, Window ou UserControl).

1
Reed Copsey

Si vous ne trouvez pas le type de fichier Dictionnaire de ressources (WPF) lorsque vous essayez de créer le dictionnaire, procédez comme suit:

Ajoutez la ligne suivante à votre fichier de projet (.csproj), dans le premier élément <PropertyGroup>:

<ProjectTypeGuids>{60dc8134-eba5-43b8-bcc9-bb4bc16c2548};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>

Rechargez le projet. Vous devriez maintenant avoir tous les types d’éléments que vous pouvez trouver dans un projet WPF normal, y compris le Dictionnaire de ressources (WPF) .

0
GregaMohorko