병합된 사전을 포함하는 리소스 사전을 참조하는 데 문제가 있습니다.
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
'source' 카테고리의 다른 글
지점이 이미 마스터로 병합되었는지 어떻게 알 수 있습니까? (0) | 2023.04.19 |
---|---|
커밋된 파일에 .gitignore 적용 (0) | 2023.04.19 |
읽기 전용 ObservableCollection 속성을 만들려면 어떻게 해야 합니까? (0) | 2023.04.19 |
디렉토리에서 마지막으로 수정된 5개의 파일을 나열하려면 어떻게 해야 합니까? (0) | 2023.04.19 |
Swift에서 문자열을 최신 상태로 변환 (0) | 2023.04.19 |