WPF 사용자 정의 컨트롤에서 가져온 리소스와 로컬 리소스를 결합하는 방법


82

공유 및 개별 리소스가 모두 필요한 여러 WPF 사용자 컨트롤을 작성하고 있습니다.

별도의 리소스 파일에서 리소스를로드하는 구문을 알아 냈습니다.

<UserControl.Resources>
    <ResourceDictionary Source="ViewResources.xaml" />
</UserControl.Resources>

그러나 이렇게하면 다음과 같이 리소스를 로컬로 추가 할 수도 없습니다.

<UserControl.Resources>
    <ResourceDictionary Source="ViewResources.xaml" />
    <!-- Doesn't work: -->
    <ControlTemplate x:Key="validationTemplate">
        ...
    </ControlTemplate>
    <style x:key="textBoxWithError" TargetType="{x:Type TextBox}">
        ...
    </style>
    ...
</UserControl.Resources>

ResourceDictionary.MergedDictionaries를 살펴 봤지만 로컬에서 추가 리소스를 정의하지 않고 둘 이상의 외부 사전 만 병합 할 수 있습니다.

나는 사소한 것을 놓치고 있는가?

언급해야합니다. WinForms 프로젝트에서 사용자 컨트롤을 호스팅하고 있으므로 공유 리소스를 App.xaml에 넣는 것은 실제로 옵션이 아닙니다.

답변:


157

나는 그것을 알아. 솔루션에는 MergedDictionaries가 포함되지만 다음과 같이 세부 사항이 정확해야합니다.

<UserControl.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="ViewResources.xaml" />
        </ResourceDictionary.MergedDictionaries>
        <!-- This works: -->
        <ControlTemplate x:Key="validationTemplate">
            ...
        </ControlTemplate>
        <style x:key="textBoxWithError" TargetType="{x:Type TextBox}">
            ...
        </style>
        ...
    </ResourceDictionary>
</UserControl.Resources>

즉, 로컬 리소스는 ResourceDictionary 태그 내에 중첩되어야합니다 . 따라서 여기 의 예 는 올바르지 않습니다.


5

MergedDictionaries 섹션에서 로컬 리소스를 정의 할 수 있습니다.

<UserControl.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <!-- import resources from external files -->
            <ResourceDictionary Source="ViewResources.xaml" />

            <ResourceDictionary>
                <!-- put local resources here -->
                <Style x:key="textBoxWithError" TargetType="{x:Type TextBox}">
                    ...
                </Style>
                ...
            </ResourceDictionary>
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
</UserControl.Resources>

5

MergedDictionaries를 사용하십시오 .

여기 에서 다음 예제를 얻었습니다 .

파일 1

<ResourceDictionary 
  xmlns=" http://schemas.microsoft.com/winfx/2006/xaml/presentation "
  xmlns:x=" http://schemas.microsoft.com/winfx/2006/xaml " > 
  <Style TargetType="{x:Type TextBlock}" x:Key="TextStyle">
    <Setter Property="FontFamily" Value="Lucida Sans" />
    <Setter Property="FontSize" Value="22" />
    <Setter Property="Foreground" Value="#58290A" />
  </Style>
</ResourceDictionary>

파일 2

   <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
          <ResourceDictionary Source="TextStyle.xaml" />
        </ResourceDictionary.MergedDictionaries>
      </ResourceDictionary> 

고맙지 만 운이 없어 그의 예는 옳은 것처럼 보이지만 실제로는 작동하지 않습니다. " 'Resources'속성이 두 번 이상 설정되었습니다."라는 메시지가 나타납니다.
Tor Haugen

MergedDictionaries에 대해 알고 있습니다. 그러나 그들은 내가 원하는 방식으로 외부 사전 참조를 로컬로 정의 된 리소스와 결합 할 수 없습니다. 이미 언급했듯이 참조하는 페이지에 예제가 있지만 작동하지 않습니다.
Tor Haugen

2
"두 번 이상 설정"오류가 발생하는 경우 : 다른 모든 리소스는 첫 번째 <ResourceDictionary> 태그 내에 있어야합니다.
Hexo 2017-12-20
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.