Подтвердить что ты не робот

Добавить ResourceDictionary в библиотеку классов

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

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

спасибо.


EDIT: ресурсный словарь, расположенный в MY.WpfPresentation.Main project (named 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>
4b9b3361

Ответ 1

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

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

Ответ 2

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

Ответ 3

На мой взгляд, вопрос заключается в добавлении файла словаря ресурсов WPF в проект библиотеки классов. Ответ заключается в том, что вы не можете сделать это для классической библиотеки классов, но для проекта проекта WPF, проекта проекта WPF Custom Control Library или WPF User Control Library. Для этих типов проектов вы можете добавить новый словарь ресурсов (WPF), который доступен через добавление нового элемента в проект.

По моему мнению, фактическое название вопроса и сам вопрос не соответствуют принятому ответу.

Ответ 4

Чтобы преобразовать проект классической библиотеки в проект библиотеки WPF (чтобы добавить UserControls, Windows, ResourcesDictionaries и т.д.), вы можете добавить следующий 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>
    <!-- ... -->    

Ответ 5

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

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

Ответ 6

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

Чтобы добавить к запросу nmariot:


Совет 1

для доступа к файлу .csproj из visual studio

щелкните правой кнопкой мыши проект → нажмите "выгрузить проект"

щелкните правой кнопкой мыши проект [в незагруженном состоянии] → нажмите "изменить" filename.csproj ''

Совет 2

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

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

Ответ 7

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

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

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

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