WPF. Рассмотрим следующий стиль с шаблоном и то, как он влияет на заполнение на MenuItem
. (Это строки, связанные с отступом, извлеченные из стиля в MaterialDesignTheme.Menu.xaml
из MaterialDesignThemes.Wpf
в github из http://materialdesigninxaml.net/.)
<Style TargetType="{x:Type MenuItem}" x:Key="MaterialDesignMenuItem" BasedOn="{x:Null}">
<Setter Property="Padding" Value="24 0"></Setter>
<Setter Property="OverridesDefaultStyle" Value="True"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type MenuItem}">
<ControlTemplate.Resources>
</ControlTemplate.Resources>
<Grid ClipToBounds="True">
</Grid>
<ControlTemplate.Triggers>
<!--#region Roles Triggers -->
<Trigger Property="Role" Value="TopLevelHeader">
<Setter Property="Padding" Value="16 0"/>
</Trigger>
<Trigger Property="Role" Value="TopLevelItem">
<Setter Property="Padding" Value="16 0"/>
</Trigger>
<!--#endregion-->
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
Легко переопределить строку заполнения по умолчанию
<Setter Property="Padding" Value="24 0"></Setter>
вроде так:
<Style TargetType="MenuItem" BasedOn="{StaticResource MaterialDesignMenuItem}">
<Setter Property="Padding" Value="4 0"></Setter>
</Style>
Я не смог найти, как определить два TopLevel ... Триггеры, чтобы их общее значение заполнения "16 0"
можно было переопределить.
В реальном коде эти триггеры делают больше, поэтому я не хочу полностью переопределять триггеры; Мне пришлось бы дублировать оставшуюся часть кода триггера.
Я бы хотел, чтобы исходный стиль указывал для них значение по умолчанию, которое я могу переопределить. Что-то вроде:
<Style TargetType="{x:Type MenuItem}" x:Key="MaterialDesignMenuItem" BasedOn="{x:Null}">
<Setter Property="Padding" Value="24 0"></Setter>
<Setter Property="TopPadding" Value="16 0"></Setter>
...
Затем переопределить:
<Style TargetType="MenuItem" BasedOn="{StaticResource MaterialDesignMenuItem}">
<Setter Property="Padding" Value="4 0"></Setter>
<Setter TopPadding="Padding" Value="4 0"></Setter>
</Style>
Но, конечно, в MenuItem нет свойства "TopPadding", поэтому оно не будет компилироваться.
Как мне создать это новое свойство в исходном стиле, обратиться к нему в шаблоне - в двух триггерах, а затем переопределить его в моем настроенном стиле?
Возможные похожие ответы:
Привязка к ресурсным ключам на каждом предмете
Привязать к прикрепленному имуществу
В худшем случае я мог бы создать подкласс MenuItem и создать шаблон, который применяется только к этому подклассу (чтобы добавить свойство "TopPadding"). Я бы предпочел не делать этого, так как это часть сложной библиотеки; Я хотел бы иметь шаблон, который будет работать с любым MenuItem. Я думаю, это означает, что любое вложенное свойство должно быть необязательным (у MenuItem его может не быть.) Я не уверен, как шаблон будет ссылаться на вложенное свойство или как установить значение по умолчанию, если оно отсутствует.
ВАЖНО: я не хочу хак, который использует свойство Tag
; Я хочу масштабируемый подход, который каким-то образом добавляет соответствующее свойство или ресурс.
ОБНОВЛЕНИЕ
Я только что нашел этот ответ ; Я не осознавал, что присоединенные свойства не должны быть определены в исходном классе - можно определить одно без подкласса MenuItem.
Мне не ясно, могу ли я установить значение default в случае, если это присоединенное свойство отсутствует, но я пытаюсь сделать это сейчас.