0

내 WPF 응용 프로그램 사용자가 기본 WPF 스타일과 내 자신의 사용자 지정 스타일의 두 가지 스타일 중에서 선택할 수있게하고 싶습니다. 나는 사용자 정의 스타일의 모든 스타일 요소를 포함하는 리소스 사전을 만들었습니다. 리소스 사전은 같은 프로젝트에 있습니다. 나는 다음과 같은 코드를 사용하여 App.Current.Resources이 사전을로드 할 때동일한 어셈블리에서 느슨한 스타일 XAML을로드 할 때 XAMLParseException : 형식 생성이 실패했습니다.

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
       xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
       xmlns:local="clr-namespace:Practicum21_Ben_Vandenberk"> 

은 ...

<Style TargetType="Window"> 
    <Setter Property="Background" Value="Black"></Setter> 
</Style> 
<Style TargetType="{x:Type local:MainWindow}" BasedOn="{StaticResource {x:Type Window}}"/> 
<Style TargetType="{x:Type local:BestellingDetail}" BasedOn="{StaticResource {x:Type Window}}"/> 
<Style TargetType="{x:Type local:CategorieDetail}" BasedOn="{StaticResource {x:Type Window}}"/> 
<Style TargetType="{x:Type local:KlantDetail}" BasedOn="{StaticResource {x:Type Window}}"/> 
<Style TargetType="{x:Type local:LeverancierDetail}" BasedOn="{StaticResource {x:Type Window}}"/> 
<Style TargetType="{x:Type local:ProduktDetail}" BasedOn="{StaticResource {x:Type Window}}"/> 
<Style TargetType="{x:Type local:WerknemerDetail}" BasedOn="{StaticResource {x:Type Window}}"/> 

는, 나는 XAMLParseException를 얻을 : "로부터 타입을 생성 텍스트 로컬 : MainWindow가 실패했습니다 ".

ResourceDictionary dic = new ResourceDictionary(); 
dic.Source = new Uri(path, UriKind.Absolute); 
App.Current.Resources.MergedDictionaries.Clear(); 
App.Current.Resources.MergedDictionaries.Add(dic); 

저는 2 시간 넘게 검색했습니다. 여러 스레드에

WPF Loose XAML ResourceDictionary

사람들이 느슨한 XAML의 상단에서의 xmlns에 "어셈블리 ="추가하는 것이 좋습니다. 하지만 이렇게하면 XAML 파일 자체가 더 이상 빌드되지 않습니다. 여기

Error: 'Cannot create unknown type '{clr-namespace:NameSpace.Properties}Settings'.'

사람들은 XAML에 '페이지'의 빌드 작업을 설정하는 제안하지만 이미 내 XAML 파일의 경우 ...

내가 프로그래밍과 꽤 새로 온 사람이었다 내 이해는 매우 제한적이지만 일반적으로 웹을 탐색하여 문제를 해결할 수 있습니다. 그래도 이번엔 안돼.

나는 그것이 나의 이해 부족 때문에 찾을 수없는 사소한 것이어야한다고 생각한다. 아니면 내가 원래의 문제 (사용자가 2 가지 스타일 중 하나를 선택할 수 있도록 함)를 완전히 잘못된 방식으로 다루고 있습니까?

답변

0

런타임에 Xaml 파일을로드하려는 경우에는 컴파일 할 필요가 없습니다. 빌드 작업을 '리소스'로 변경 한 다음 linked answer과 같이한정자를 네임 스페이스 가져 오기에 추가하십시오. 또한

, '페이지'로 XAML 파일을 작성,하지만 당신은 생성자로 인스턴스화 할 수 있도록 그것을 클래스 이름을 부여하십시오 : 당신이 경로를 이동하는 경우

<ResourceDictionary x:Class="Practicum21_Ben_Vandenberk.AlternateResources" 
    ...> 

App.Current.Resources.MergedDictionaries.Add(new AlternateResources()); 

, 당신은 추가 할 필요가 없습니다 assembly= 수식어.

+0

시간을내어 답변 해 주셔서 감사합니다. 어셈블리 정보를 사용하여 첫 번째 제안을 시도하면 이전과 같이 빌드되지 않습니다. 오류 형식 참조에서 'MainWindow'라는 공용 형식을 찾을 수 없습니다. 두 번째 제안을 통해 런타임시 MergedDictionaries에 AlternateResources()를 추가 할 수 있지만 스타일은 적용되지 않습니다. 이전에 모든 창 스타일 (위)을 주석 처리 한 경우 다른 모든 스타일이 적용되었습니다. 늦어지고 있습니다. 내일은 더 명확하게 보입니다. 감사! –

+0

Odd. 빌드 액션을'Resource'로 변경하면, ** ** 빌드가되어서는 안됩니다. 두 번째 경우에는 'AlternateResources' 사전을 추가하기 전에 리소스를'Clear() '하고 계십니까? 나는 그 대답을 내 대답에서 제외 시켰지만, 당신이 그것을 제거해야 함을 암시하는 것은 아닙니다. 나는 당신이 그것을 필요로하는지 아닌지를 모른다.또한'InitializeComponent()'를 호출하는'AlternateResources'에 대해 생성자가 생성되는지 확인할 수 있습니까? –

+0

안녕하세요, 오늘 아침에 빌드 작업을 리소스로 설정하고 어셈블리 = 한정자를 추가하면 매력처럼 작동했습니다. 신속하고 정확한 답장을 보내 주셔서 감사합니다! –