web-dev-qa-db-ja.com

ResourceDictionaryをクラスライブラリに追加する

WPFウィンドウと、特定のwpfコントロールのカスタマイズに役立つc#クラスから継承された一部のユーザーコントロールを含むクラスライブラリを作成しました。

次に、ResourceDictionaryを追加して、wpfクラス間でスタイルを共有できるようにします。出来ますか?

THX。


編集:MY.WpfPresentation.Mainプロジェクト(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>

それを使う:

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

このようなリソースディクショナリを作成する

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

そして、あなたはそれをあなたが望む場所に置くことができます

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

従来のライブラリプロジェクトをWPFライブラリプロジェクトに変換するには(UserControlsWindowsResourcesDictionariesなどを追加するため)、次のXMLを.csprojに追加できます。最初のPropertyGroup内のファイルNode:

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

完全な例:

<?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>
    <!-- ... -->    
14
nmariot

@ punker76の answer は素晴らしいですし、多くの助けになりましたが、空のファイルを作成してリソースタグをそのファイルに追加する場合は、ファイルのプロパティに移動してBuildActiontoResourceコピー先...toDo not copyand clear CustomTool property if it's set。

13
Chris W.

私の意見では、問題はクラスライブラリプロジェクトにWPFリソースディクショナリファイルを追加することに関するものです。答えは、クラシッククラスライブラリの場合はできませんが、WPFアプリケーションプロジェクトの場合、WPFカスタムコントロールライブラリプロジェクトまたは- WPFユーザーコントロールライブラリ。これらのプロジェクトタイプでは、新しいリソースディクショナリ(WPF)を追加できます。このオプションは、プロジェクトに新しいアイテムを追加することで利用できます。

私の意見では、実際の質問のタイトルと質問自体は、受け入れられた回答に対応していません。

11
XMight

辞書を作成しようとしたときにResource Dictionary(WPF)ファイルタイプが見つからない場合は、次のようにします。

次の行をプロジェクトファイル(.csproj)の最初の<PropertyGroup>要素に追加します。

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

プロジェクトをリロードします。 Resource Dictionary(WPF)を含む、通常のWPFプロジェクトで見つかるすべての項目タイプが揃ったはずです。

3
GregaMohorko

コメントはまだできませんが、この回答を2回使用しました。

Nmariotの回答に追加するには:


ヒント1

visual Studioから.csprojファイルにアクセスする

プロジェクトを右クリック->「プロジェクトのアンロード」をクリック

プロジェクトを右クリック[アンロード状態]-> [編集 'filename.csproj]をクリック

ヒント2

リソースディクショナリが追加された後のエラー警告を回避するには:

system.Xamlへの参照を追加する

1
Declan Taylor

はい。 ResourceDictionaryをプロジェクトに直接追加できます。

使用したい場合は、必要に応じて MergedDictionaries を使用してXAMLにマージし、スタンドアロンのResourceDictionaryをタイプのリソース(つまり、ウィンドウまたはUserControl)。

1
Reed Copsey