source

병합된 사전을 포함하는 리소스 사전을 참조하는 데 문제가 있습니다.

factcode 2023. 4. 19. 23:30
반응형

병합된 사전을 포함하는 리소스 사전을 참조하는 데 문제가 있습니다.

CommonLibraryWpfTemes라는 라이브러리가 있으며, 그 안에 여러 개의 리소스 사전 XAML 파일이 있습니다.My Themes/Generic.xml 파일에는 ResourceDictionary가 포함되어 있습니다.다른 모든 파일을 병합하는 MergedDictionaries 선언입니다.

Generic.xaml

<ResourceDictionary
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <ResourceDictionary.MergedDictionaries>
        <ResourceDictionary
            Source="/CommonLibraryWpfThemes;component/ResourceDictionaries/BrushDictionary.xaml" />
        <ResourceDictionary
            Source="/CommonLibraryWpfThemes;component/ResourceDictionaries/TextBlockDictionary.xaml" />
        <ResourceDictionary
            Source="/CommonLibraryWpfThemes;component/ResourceDictionaries/LabelDictionary.xaml" />
        <ResourceDictionary
            Source="/CommonLibraryWpfThemes;component/ResourceDictionaries/ButtonDictionary.xaml" />
        <ResourceDictionary
            Source="/CommonLibraryWpfThemes;component/ResourceDictionaries/WindowDictionary.xaml" />
    </ResourceDictionary.MergedDictionaries>
</ResourceDictionary>

어플리케이션 프로젝트에서 CommonLibraryWpfTemes를 참조하고 App.xaml 파일에서 Generic.xml을 명시적으로 참조합니다.

App.xaml -- FAILES

<Application
    x:Class="MyApp.App"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <Application.Resources>
        <ResourceDictionary
            Source="/CommonLibraryWpfThemes;component/Themes/Generic.xaml" />
    </Application.Resources>
</Application>

이거 안 되네.앱을 실행하면 다음 오류가 발생합니다.

System.Windows.Markup.XamlParseException occurred
  Message="Cannot find resource named '{_fadedOrangeBrush}'. Resource names are case sensitive.  Error at object 'System.Windows.Setter' in markup file 'CommonLibraryWpfThemes;component/ResourceDictionaries/WindowDictionary.xaml' Line 18 Position 13."
  Source="PresentationFramework"
  LineNumber=18
  LinePosition=13

Generic.xaml의 내용을 App.xaml에 직접 저장하면 모든 것이 정상적으로 작동합니다.

App.xaml -- SUCCESS

<Application
    x:Class="MyApp.App"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <Application.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary
                    Source="/CommonLibraryWpfThemes;component/ResourceDictionaries/BrushDictionary.xaml" />
                <ResourceDictionary
                    Source="/CommonLibraryWpfThemes;component/ResourceDictionaries/TextBlockDictionary.xaml" />
                <ResourceDictionary
                    Source="/CommonLibraryWpfThemes;component/ResourceDictionaries/LabelDictionary.xaml" />
                <ResourceDictionary
                    Source="/CommonLibraryWpfThemes;component/ResourceDictionaries/ButtonDictionary.xaml" />
                <ResourceDictionary
                    Source="/CommonLibraryWpfThemes;component/ResourceDictionaries/WindowDictionary.xaml" />
            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>
    </Application.Resources>
</Application>

내가 잘못된 방향으로 가고 있는 것 같아.제 목표는 모든 개별 파일을 나열할 필요 없이 여러 응용 프로그램에서 모든 테마 리소스를 쉽게 참조할 수 있도록 하는 것입니다.추천할 만한 방법이 있나요?(주의: 저는 여러 테마를 바꾸려는 것이 아닙니다.단 하나의 테마가 있습니다.

Visual Studio의 디자이너를 방해하지 않고 외부 라이브러리의 리소스를 참조할 수 있는 방법을 알려주시면 감사하겠습니다.

감사해요.

편집:

ResourceDictionary에서 ResourceDictionary를 래핑하려고 했습니다.MergeDictionary 요소도 동작하지 않았습니다(같은 에러가 표시됩니다).

<Application
    x:Class="MyApp.App"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <Application.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary
                    Source="/CommonLibraryWpfThemes;component/Themes/Generic.xaml" />
            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>
    </Application.Resources>
</Application>

앞에서 설명한 것과 유사한 질문에 대한 답변은 병합된 사전에 병합된 사전 추가 질문을 참조하십시오.

이것은 최적화 버그입니다.Inner MergeDictionary에 없는 Microsoft Connect / DefaultStyleKey 스타일을 참조하십시오.

XAML에서 모든 객체를 작성할 때 기본 스타일(타입 키 포함 스타일)이 존재하는 경우 해당 스타일을 적용해야 합니다.(암시적으로) 가능한 경량화를 실현하기 위해 몇 가지 퍼포먼스 최적화가 이루어지고 있는 것을 생각할 수 있습니다.그 중 하나는 리소스 사전이 "기본 스타일 포함"으로 플래그가 지정되지 않는 한 리소스 사전을 검색하지 않는다는 것입니다.모든 기본 스타일이 3단계(또는 더 깊은) 병합된 사전에 중첩된 경우 상위 사전에 플래그가 표시되지 않으므로 검색이 건너뜁니다.이 문제를 해결하려면 루트 사전에서 기본 스타일을 다른 항목에 추가합니다.

따라서 루트 사전에 더미 스타일을 추가하면 이 문제가 해결됩니다.

<Application x:Class="MyApp.App"  
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"  
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">  
    <Application.Resources> 
        <ResourceDictionary> 
            <ResourceDictionary.MergedDictionaries> 
                <ResourceDictionary 
                    Source="/CommonLibraryWpfThemes;component/Themes/Generic.xaml" /> 
                </ResourceDictionary.MergedDictionaries> 
            <!-- Dummy Style, anything you won't use goes --> 
            <Style TargetType="{x:Type Rectangle}" /> 
        </ResourceDictionary> 
    </Application.Resources> 
</Application>   

App.xaml.cs에서 Initialize Component()를 호출하는 컨스트럭터를 확인합니다.이것은 자원 사전을 Marge 하는 것입니다.

참고할 요.generic.xaml지원 기능이 내장되어 있습니다.그러나 이는 사용자가 명시적으로 설정하지 않은 기본 스타일을 제공함을 의미합니다.명시적으로 설정된 스타일/템플릿은 명시적으로 참조된 Res 사전에서 얻을 수 있어야 합니다.

(명확한 편집을 위해)

중 는 " " " 입니다.App.xaml정의된 리소스는 특정 리소스 사전을 참조할 필요 없이 전체 앱에서 액세스할 수 있습니다.리소스 자체는 이름으로 액세스할 수 있어야 합니다.

이것이 실패하는 이유

<Application.Resources>
    <ResourceDictionary
        Source="/CommonLibraryWpfThemes;component/Themes/Generic.xaml" />
</Application.Resources>

안것 MergedDictionary퍼,, 병병병사 사다다다다다다리소스에 직접 추가하는 것은 사용자가 로컬로 선언하는 리소스(예: 스타일 등)에만 적용됩니다.

합칠 generic.xaml을 외부에서 하는 자료들을 그 것 .app.xaml.

또한 스타일은 "기본 스타일" 동작을 하기 위해 generic.xaml에 있을 필요가 없습니다.요소의 유형과 동일한 키를 가진 스타일에 액세스할 수 있는 경우(글로벌 또는 로컬 리소스에서), 스타일은 기본 스타일로 사용됩니다.generic.xaml그냥 편리할 뿐이죠

답을 확인해 보세요.

기타 사용자 지정 브러시 등의 경우 해당 리소스를 명시적으로 참조해야 합니다.

이 글의 .WindowDictionary.xaml이 에러에는, 특정의 냄새가 있습니다.

유닛 테스트에서 이 에러가 발생하고 있었는데, 크리스의 답변으로 필요한 단서를 얻을 수 있었습니다.기본적으로 첫 번째 테스트 방법은 다음과 같습니다.

        MyApplication.App app = new MyApplication.App();
        app.InitializeComponent();

그리고 갑자기 내 페이지의 템플릿을 찾을 수 있었다.주의: App.cs도 유닛 테스트 중이라면 앱 인스턴스가 이미 존재하는지 확인해야 합니다.

솔루션이 여기에 있습니다. [회피책]을 클릭합니다.

언급URL : https://stackoverflow.com/questions/1229395/trouble-referencing-a-resource-dictionary-that-contains-a-merged-dictionary

반응형