Як поєднати імпортовані та локальні ресурси в контролі користувача 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> 

Дякую, але не везе. Його приклад здається правильним, але насправді не працює. Я отримую повідомлення "Властивість" Ресурси "встановлюється більше одного разу".
Tor Haugen

Я знаю про MergedDictionaries. Але вони не дозволяють мені поєднувати посилання на зовнішні словники з локально визначеними ресурсами так, як я хочу. Як уже зазначалося, на сторінці, на яку ви посилаєтесь, є приклад, але він не працює.
Tor Haugen

2
Для тих, хто отримує цю помилку "встановити більше одного разу": всі інші ресурси повинні бути в межах першого тегу <ResourceDictionary>.
Hexo
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.