별도의 어셈블리에서 ResourceDictionary


245

여러 개의 개별 응용 프로그램에서 사용하려는 리소스 사전 파일 (MenuTemplate.xaml, ButtonTemplate.xaml 등)이 있습니다. 응용 프로그램의 어셈블리에 추가 할 수 있지만 이러한 리소스를 하나의 단일 어셈블리로 컴파일하고 응용 프로그램에서 참조하는 것이 더 좋습니다.

리소스 어셈블리가 구축 된 후 응용 프로그램의 App.xaml에서 리소스 어셈블리를 어떻게 참조 할 수 있습니까? 현재 ResourceDictionary.MergedDictionaries를 사용하여 개별 사전 파일을 병합합니다. 어셈블리에 파일이 있으면 xaml에서 어떻게 참조 할 수 있습니까?


1
이 잔인한있을 수 있습니다,하지만 당신은 기술이 여기에 설명하여 수출을위한 자원을 준비 할 수 있습니다 : alexfeinberg.wordpress.com/2015/08/16/...를 . 이 작업의 주요 장점은 여러 버전의 리소스 어셈블리가 동일한 appdomain에로드되는 문제를 방지하는 것입니다.
— user195275

답변:


353

팩 URI 구문을 확인하십시오 . 당신은 이와 같은 것을 원합니다 :

<ResourceDictionary Source="pack://application:,,,/YourAssembly;component/Subfolder/YourResourceFile.xaml"/>

1
YourAssembly가 응용 프로그램 경로 안에 포함되어 있지 않으면 어떻게합니까?
— SaneDeveloper

@Engineer Spock : 그러면 CLR은 도움 없이는 찾을 수 없습니다 (WPF와는 아무런 관련이 없음). app.config 에 프로브 경로를 추가 하거나 AppDomain.AssemblyResolve어셈블리를 찾는 데 도움이되도록 첨부하십시오 .
— Kent Boogaart

1
YourAssembly 프로젝트가 YourAssembly를 참조해야하는 응용 프로그램 프로젝트와 같은 수준 인 경우 프로빙 경로를 추가해야합니까? 예를 들어, C : \ Solution \ AppProject \ 및 C : \ Solution \ YourAssemblyProject \
— SaneDeveloper

1
@EngineerSpock : 이것은 별도의 질문이므로 열어야합니다.
— Kent Boogaart

2
이 대답은 의미가 없습니다. 그것을 따르기 위해서는 이미 그것을하는 방법을 알아야합니다!
— user1040323

97

예를 들어, 15 초만 대답하면

WPF 라이브러리에 "common"이라는 "styles.xaml"이 있고 기본 응용 프로그램 프로젝트에서 사용하려고한다고 가정합니다.

  1. 기본 프로젝트에서 "공통"프로젝트로 참조 추가
  2. app.xaml에는 다음이 포함되어야합니다.

<Application.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="pack://application:,,,/Common;component/styles.xaml"/>
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
</Application.Resources>

건배


2
그런 다음 Visual Studio 2010 속성 창을 통해 styles.xaml에 정의 된 리소스를 어떻게 사용할 수 있습니까? 요소를 선택한 다음 배경 속성으로 리소스 적용을 클릭하면 styles.xaml에 정의 된 요소가 아니라 SystemColors 만 표시됩니다. 그러나 XAML에 리소스 이름을 직접 입력하면 제대로 작동하므로 올바르게 참조됩니다.
— xr280xr

UserControl에서 ResourceDictionary를 참조하는 경우 UserControl 및 기본 창 프로젝트의 두 위치에서 어셈블리에 대한 참조를 추가해야한다고 덧붙였습니다. 그렇지 않으면 런타임 오류가 발생합니다.
— Andrejs Gasilovs


16

리소스 전용 DLL은 옵션입니다. 그러나 응용 프로그램을 다시 컴파일하지 않고 리소스를 수정하지 않는 한 반드시 필요한 것은 아닙니다. 하나의 공통 ResourceDictionary 파일도 있습니다. 리소스 등을 얼마나 자주 변경하는지에 따라 다릅니다.

<ResourceDictionary Source="pack://application:,,,/
     <MyAssembly>;component/<FolderStructureInAssembly>/<ResourceFile.xaml>"/>

MyAssembly- 확장명이없는 어셈블리 이름

FolderStructureInAssembly- 자원이 접힌 경우 폴더 구조를 지정하십시오.

이 작업을 수행 할 때 siteOfOrigin 도 알고있는 것이 좋습니다 .

WPF는 application : ///과 siteoforigin : ///의 두 가지 권한을 지원합니다. application : /// 기관은 리소스 및 컨텐츠 파일을 포함하여 컴파일시 알려진 애플리케이션 데이터 파일을 식별합니다. siteoforigin : /// authority는 site of origin 파일을 식별합니다. 각 권한의 범위는 다음 그림에 표시되어 있습니다.

여기에 이미지 설명을 입력하십시오



4

XAML 사용 :

당신이 다른 알고있는 경우에 assembly구조를하고 싶은 resources에 C #을 코드, 다음 코드 아래 사용

 ResourceDictionary dictionary = new ResourceDictionary();
 dictionary.Source = new Uri("pack://application:,,,/WpfControlLibrary1;Component/RD1.xaml", UriKind.Absolute);
 foreach (var item in dictionary.Values)
 {
    //operations
 }

출력 :ResourceDictionary RD1.xaml 프로젝트 WpfControlLibrary1에 StackOverflowApp프로젝트 를 사용하려는 경우 .

프로젝트 구조 :

프로젝트 구조

자원 사전 : 자원 사전

코드 출력 :

산출

추신 : 모든 ResourceDictionary파일은 Build Action' Resource'또는 ' Page' 이어야합니다 .

C # 사용 :

누구나 순수 C # 코드 로 솔루션을 원한다면이 솔루션 을 참조하십시오 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.