Добавить ResourceDictionary в библиотеку классов - PullRequest
22 голосов
/ 18 ноября 2011

Я создал библиотеку классов, которая содержит Windows WPF и некоторые пользовательские элементы управления, унаследованные от моих классов c #, что помогает мне настраивать определенные элементы управления wpf.

Теперь я хочу добавить ResourceDictionary, чтобы помочь мне делиться стилями между моими классами wpf. Возможно ли это?

Thx.


EDIT: Файл словаря ресурсов, расположенный в проекте 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>

Ответы [ 7 ]

29 голосов
/ 18 ноября 2011

создать словарь ресурсов, подобный этому

<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>
13 голосов
/ 12 февраля 2014

@ punker76 - отличный ответ, который мне очень помог, но стоит добавить, что если вы создаете пустой файл и добавляете в него тег ресурса, вы также должны перейти к свойствам файла, установите BuildAction на Ресурс , Копировать в ... в Не копировать и очищать свойство CustomTool, если оно установлено.

10 голосов
/ 27 мая 2016

Чтобы преобразовать проект классической библиотеки в проект библиотеки WPF (чтобы добавить UserControls, Windows, ResourcesDictionaries и т. Д.), Вы можете добавить следующий XML в файл .csproj в первом узле PropertyGroup:

<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>
    <!-- ... -->    
10 голосов
/ 21 января 2016

По моему мнению, вопрос заключается в добавлении файла словаря ресурсов WPF в проект библиотеки классов. Ответ в том, что вы не можете сделать это для классической библиотеки классов , но для приложения WPF * проекта 1004 *, библиотеки пользовательских элементов управления WPF * проекта 1006 * или WPF Пользовательская библиотека управления . Для этих типов проектов вы можете добавить новый словарь ресурсов (WPF), опция которого доступна при добавлении нового элемента в проект.

На мой взгляд, само название вопроса и сам вопрос не соответствуют принятому ответу.

1 голос
/ 26 августа 2017

Поскольку я пока не могу комментировать, но я уже дважды использовал этот ответ:

Добавить к ответу nmariot:


Совет 1

чтобы получить файл .csproj из visual studio

щелкните правой кнопкой мыши проект -> щелкните «выгрузить проект»

щелкните правой кнопкой мыши проект [в незагруженном состоянии] -> нажмите «edit» filename.csproj ''

Совет 2

, чтобы избежать появления предупреждений об ошибках после добавления словаря ресурсов:

добавить ссылку на System.Xaml

1 голос
/ 18 ноября 2011

Да.Вы можете добавить ResourceDictionary непосредственно в свой проект.

Если вы хотите использовать его, вы можете объединить его с XAML по мере необходимости, используя MergedDictionaries , чтобы «объединить» этот автономный ResourceDictionaryв ресурсы типа (то есть: Window или UserControl).

0 голосов
/ 01 февраля 2019

Если вы не можете найти тип файла Словарь ресурсов (WPF) при попытке создать словарь, сделайте следующее:

Добавьте следующую строку в файл проекта (.csproj) в первый элемент <PropertyGroup>:

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

Перезагрузите проект. Теперь у вас должны быть все типы элементов, которые можно найти в обычном проекте WPF, включая Словарь ресурсов (WPF) .

...