Подтвердить что ты не робот

Наследование стиля на основе разных XAML

Как указать тег BasedOn в стиле для стиля, определенного в другом файле.

Пример

Dictionary1.xaml определяет

   <Style x:Key="basicStyle" TargetType="TextBlock" >
       <Setter Property="FontSize" Value="24"></Setter>
       <Setter Property="Foreground" Value="DarkGray"></Setter>
       <Setter Property="FontWeight" Value="Bold"></Setter>
    </Style>

В Dictionary2.xaml мне нужно что-то вроде

    <Style x:Key="headerStyle" TargetType="TextBlock" >
       <Setter Property="FontSize" Value="46"></Setter>
       <Setter Property="Foreground" Value="DarkGray"></Setter>
       <Setter Property="FontWeight" Value="Bold"></Setter>
    </Style>

Как это сделать?

4b9b3361

Ответ 1

Простой способ:

В Dictionary2.xaml укажите MergedDictionaries (сразу после открытия тега ResourceDictionary):

<ResourceDictionary.MergedDictionaries>
    <ResourceDictionary Source="/Path/to/Dictionary1.xaml" />
</ResourceDictionary.MergedDictionaries>

И затем

<Style x:Key="headerStyle" TargetType="TextBlock" BasedOn="{StaticResource basicStyle}" >
    .....
</Style>

Это решит проблему, но, как и все простые решения, есть улов: каждый раз, когда вы объединяете словари, вы эффективно создаете копию объединенного словаря. И он рекурсивный - если у вас есть Dict3.xaml и Dict4.xaml, которые загружают Dictionary2.xaml, у вас будет три экземпляра Dictionary1.xaml. Со сложной структурой зависимостей вы можете добраться до точки, в которой у вас есть 19 000 объектов словаря в памяти при запуске приложения, а объем памяти - от 180 МБ до 1200 МБ (TrueStory ™:().

Решение является SharedResourceDictionary. Реализация в учебнике должна рассматриваться как отправная точка и, вероятно, потребуется некоторый уровень настройки - в зависимости от сценария использования. Google "wpf SharedResourceDictionary" для некоторых исправлений и решений.