Установить стиль по умолчанию для FrameworkElement не применяется к производному классу - PullRequest
0 голосов
/ 03 августа 2020

Я новичок в XAML. Я создаю новый стиль по умолчанию в ResourceDictionary.

<Style TargetType="FrameworkElement" BasedOn="{StaticResource {x:Type FrameworkElement}}">
    <Setter Property="Margin" Value="5"/>
    <Setter Property="VerticalAlignment" Value="Center"/>
</Style>

Затем я импортирую его в UserControl.Resources.

<ResourceDictionary>
   <ResourceDictionary.MergedDictionaries>
      <ResourceDictionary Source="pack://application:,,,/PathToStyle.xaml"/>
   </ResourceDictionary.MergedDictionaries>
</ResourceDictionary>

Я ожидаю, что он будет применен ко всем FrameworkElement используются в этом UserControl, но это не так.

Какая информация мне здесь не хватает?

Ответы [ 3 ]

0 голосов
/ 03 августа 2020

Проблема в том, что TargetType указан c.

Стиль, который вы не указываете ax: Key to автоматически получает ключ, эквивалентный его типу.

Следовательно ваш стиль:

 <Style TargetType="FrameworkElement"

На самом деле ему дан ключ x:

 <Style x:Key="{x:Type FrameworkElement}"

https://docs.microsoft.com/en-us/dotnet/api/system.windows.style.targettype?redirectedfrom=MSDN&view=netcore-3.1#System_Windows_Style_TargetType

кусок ui, который «ищет» стиль, ищет ключ, соответствующий этому типу, используя этот x: Key. Он также не выполняет поиск по цепочке наследования.

EDIT:

Вы можете доказать это:

В новом приложении wpf добавьте элемент frameworkelement в главное окно и style нацелен на frameworkelement.

<Window.Resources>
    <Style TargetType="FrameworkElement">
        <Setter Property="Height" Value="10"/>
    </Style>
</Window.Resources>
<Grid>
    <local:TestSubClass/>
</Grid>

и

public class TestSubClass : FrameworkElement

Разверните его и посмотрите на живое визуальное дерево> Свойства. Элемент framework заполняет сетку и имеет фактическую высоту, соответствующую высоте сетки. На это не установлен никакой стиль. Следовательно, это ситуация, когда стиль не установлен, и наследование не работает, как заявлено в другом сообщении. взгляните на живое визуальное дерево.

В свойствах есть стиль.

Фактическая высота 10.

0 голосов
/ 03 августа 2020

Какая информация мне здесь не хватает?

Тот факт, что существуют стили по умолчанию, определенные для более производных типов, таких как, например, Button и Control, и что они потребуют будет применяться вместо вашего пользовательского стиля FrameworkElement.

Ваш подход к определению одного Style для всех FrameworkElements не будет работать. Вам нужно будет определить неявный тип для каждого производного типа FrameworkElement.

0 голосов
/ 03 августа 2020

Я ожидаю, что он будет применяться ко всем FrameworkElement, используемому в этом UserControl

Под всеми FrameworkElement вы, вероятно, имеете в виду все FrameworkElements, включая его производные. Применение стиля Style как неявного отлично работает, если вы нацеливаетесь на отдельный элемент управления, например Button. Однако это может работать не так, как вы ожидаете, если вы нацеливаетесь на базовый тип элемента управления, например FrameworkElement, потому что каждая производная этого базового типа могут иметь свой собственный стиль, применяемый явно или неявно, что нарушает ваше ожидаемое поведение:

  • Не основано на стиле базового типа
  • Не основано на транзитивном стиле на основе стиля базового типа
  • Переопределение свойств базового стиля

Существенное недоразумение состоит в том, что все стили производных базового типа будут основывать свой стиль на стиле указанный базовый тип, но это не применяется в целом.

Вы можете проверить это самостоятельно, извлекая Style любого элемента управления через Visual Studio или Blend. Например, давайте посмотрим на Style из Button. Как видите, он даже не основан на FrameworkElement, поэтому не будет применять ваш базовый стиль. Даже если это так, есть вероятность, что оно переопределит само свойство Margin.

<Style x:Key="ButtonStyle" TargetType="{x:Type Button}">
   <Setter Property="FocusVisualStyle" Value="{StaticResource FocusVisual}"/>
   <Setter Property="Background" Value="{DynamicResource PrimaryHueMidBrush}"/>
   <Setter Property="BorderBrush" Value="{DynamicResource PrimaryHueMidBrush}"/>
   <!-- ...other setters. -->
</Style>

Кроме того, вы должны определить свой стиль базового типа перед любым другим стили производных, потому что вы можете использовать BasedOn только с StaticResource. Следовательно, если стиль производного элемента управления уже определен до вашего стиля, ваш базовый стиль не будет применяться .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...