226

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

리소스 어셈블리가 빌드 된 후 내 응용 프로그램의 App.xaml에서 어떻게 참조 할 수 있습니까? 현재 ResourceDictionary.MergedDictionaries를 사용하여 개별 사전 파일을 병합합니다. 제가 그것들을 집회에 가지고 있다면 xaml에서 그들을 어떻게 참조 할 수 있습니까?


  • 이는 잔인 할 수도 있지만 여기에 설명 된 기술을 사용하여 내보내기를위한 리소스를 준비 할 수 있습니다.alexfeinberg.wordpress.com/2015/08/16/…. 이렇게하는 주요 이점은 여러 버전의 리소스 어셈블리가 동일한 appdomain으로로드되는 문제를 방지하는 것입니다. - user195275

6 답변


329

체크 아웃팩 URI 구문. 당신은 다음과 같은 것을 원한다.

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


  • YourAssembly가 응용 프로그램 경로 안에 포함되어 있지 않으면 어떻게됩니까? - EngineerSpock
  • @Engineer Spock : CLR은 도움없이 (WPF와 특별히 관련 없음) 찾을 수 없습니다. 프로빙 경로를app.config, 또는에 첨부AppDomain.AssemblyResolve어셈블리를 찾는 데 도움이됩니다. - Kent Boogaart
  • YourAssembly 프로젝트가 YourAssembly를 참조해야하는 응용 프로그램 프로젝트와 동일한 수준에 있다면 프로빙 경로를 추가해야합니까? 예를 들어, C : \ Solution \ AppProject \ 및 C : \ Solution \ YourAssemblyProject \ - EngineerSpock
  • @EngineerSpock : 이것은 별도의 질문이므로 하나를여십시오. - Kent Boogaart
  • 이 대답은 말이되지 않습니다. 따라하기 위해서는 이미 그것을하는 방법을 알아야합니다! - user1040323

90

예를 들어,이 15 초 응답을 만들기 위해서 -

"common"이라는 WPF 라이브러리에서 "styles.xaml"을 가지고 있고이를 주 응용 프로그램 프로젝트에서 사용하려고한다고 가정 해보십시오.

  1. 기본 프로젝트의 참조를 "공통"프로젝트에 추가하십시오.
  2. app.xaml은 다음을 포함해야합니다.

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

건배


  • 그런 다음 Visual Studio 2010 속성 창을 통해 styles.xaml에 정의 된 리소스를 사용하려면 어떻게해야합니까? 요소를 선택하고 Background 속성에 대해 Apply Resource를 클릭하면 styles.xaml에 정의되지 않은 SystemColors 만 표시됩니다. 하지만 XAML에서 리소스 이름을 직접 입력하면 제대로 작동하므로 올바르게 참조됩니다. - xr280xr
  • UserControl에서 ResourceDictionary를 참조하는 경우이를 추가하려면 UserControl 및 기본 창 프로젝트의 두 위치에서 어셈블리에 대한 참조를 추가해야합니다. 그렇지 않으면 런타임 오류가 발생합니다. - Gattuso

33

.NET 4.5와 함께 일하고 있는데이 작업을 수행 할 수 없습니다 ... WPF Custom Control Library를 사용하고있었습니다. 이것은 결국 나를 위해 일했다. ..

<ResourceDictionary Source="/MyAssembly;component/mytheme.xaml" />

출처: http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/11a42336-8d87-4656-91a3-275413d3cc19


16

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

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

하여 MyAssembly- 확장없는 어셈블리 이름 만

FolderStructureInAssembly- 리소스가 폴드 상태 인 경우 폴더 구조를 지정합니다.

이 작업을 수행 할 때siteOfOrigin게다가.

WPF는 application : ///과 siteoforigin : ///이라는 두 가지 권한을 지원합니다.   application : /// 권한은 응용 프로그램 데이터 파일을 식별합니다.   리소스 및 컨텐트 파일을 포함하여 컴파일 타임에 알려져 있습니다. 그만큼   siteoforigin : /// 기관은 원본 파일의 사이트를 식별합니다. 망원경   다음 그림은 각 기관의 이름입니다.

enter image description here


5

UWP의 경우 :

<ResourceDictionary Source="ms-appx:///##Namespace.External.Assembly##/##FOLDER##/##FILE##.xaml" />


4

XAML 사용 :

당신이 다른 사람을 알고 있다면assembly구조를 원하고resources...에서기음#코드를 입력 한 다음 아래 코드를 사용하십시오.

 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계획.

프로젝트 구조:

Structure of Projects

리소스 사전 : Resource Dictionary

코드 출력 :

Output

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

C #사용 :

누군가가 순수하게 해결책을 원한다면C #코드그때 내이   해결책.

연결된 질문


관련된 질문

최근 질문