별도의 어셈블리에서 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구조를하고 싶은 resourcesC #을 코드, 다음 코드 아래 사용

 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 프로젝트 WpfControlLibrary1StackOverflowApp프로젝트 를 사용하려는 경우 .

프로젝트 구조 :

프로젝트 구조

자원 사전 : 자원 사전

코드 출력 :

산출

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

C # 사용 :

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

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