Я использую MaterialDesign в среде XAML для стилизации своего приложения WPF.
В одном месте моего приложения я хочу использовать кнопку, стилизованную с помощью MaterialDesignPaperButton.
Поскольку мне нужно немного изменить этот стиль, я создал собственный стиль:
<Style x:Key = "StateMachineButton" TargetType = "{x:Type Button}"
BasedOn = "{StaticResource MaterialDesignPaperButton}">
<Setter Property = "Margin" Value = "16 0 16 0" />
<Setter Property = "HorizontalContentAlignment" Value = "Stretch" />
<Setter Property = "VerticalContentAlignment" Value = "Stretch" />
<Setter Property = "HorizontalAlignment" Value = "Center" />
<Setter Property = "VerticalAlignment" Value = "Center" />
<Setter Property = "TextBlock.TextAlignment" Value = "Center" />
</Style>
а затем установите определенный стиль кнопки:
<Button Style = "{StaticResource StateMachineButton}">
<TextBlock Text = "Long defined text here which shall be wraped."
TextWrapping = "Wrap" />
</Button>
Как видите, текст на кнопке будет перенесен, поскольку он может быть длиннее. Для переноса свойство Height не должно быть установлено.
Но это свойство высоты задано в используемом стиле. Посмотрите эту ссылку.
Есть ли способ сбросить свойство высоты до значения по умолчанию, например, если оно не установлено?
Я уже пробовал:
<Setter Property = "Height" Value = "{x:Null}" />
Но тип double не поддерживает значения NULL.
Я не совсем уверен, что вы ищете. Я предполагаю, что вы хотите, чтобы кнопка увеличивалась/сжималась по мере переноса или не переноса текста.
В этом случае вам следует привязать высоту к TextBlock.ActualHeight
<Style x:Key = "StateMachineButton" TargetType = "{x:Type Button}"
BasedOn = "{StaticResource MaterialDesignPaperButton}">
<Setter Property = "Margin" Value = "16 0 16 0" />
<Setter Property = "HorizontalContentAlignment" Value = "Stretch" />
<Setter Property = "VerticalContentAlignment" Value = "Stretch" />
<Setter Property = "HorizontalAlignment" Value = "Center" />
<Setter Property = "VerticalAlignment" Value = "Center" />
<Setter Property = "TextBlock.TextAlignment" Value = "Center" />
<Setter Property = "Height"
Value = "{Binding Path=TextBlock.ActualHeight, RelativeSource = {RelativeSource Mode=Self}}" />
</Style>
Стритер, ты прав. Как сказал Клеменс, это делается по умолчанию, и я хочу использовать это поведение по умолчанию. Тем не менее, спасибо за ответ!
Значением свойств Width
и Height
по умолчанию является Double.NaN
.
Чтобы установить это значение, объявите следующий Setter, где строка NaN
автоматически преобразуется в Double.NaN
.
<Setter Property = "Height" Value = "NaN"/>
Вы также можете установить значение явно. Добавьте следующую ссылку на пространство имен XAML.
xmlns:sys = "clr-namespace:System;assembly=mscorlib"
и объявите этот сеттер:
<Setter Property = "Height" Value = "{x:Static sys:Double.NaN}"/>
Большое спасибо. При установке для параметра «Высота» значения NaN размер кнопки изменяется в соответствии с высотой ее содержимого! Это то, что мне нужно.
Вряд ли когда-либо возникнет необходимость привязывать ширину/высоту элемента к ActualWidth/ActualHeight родительского или дочернего элемента. Все это делается с помощью обычного макета. Все, что вам нужно сделать, это сбросить значение свойства Height по умолчанию — именно это и просил OP.