Установите для свойства высоты стиля кнопки в дизайне материала в XAML значение по умолчанию

Я использую 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.

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
65
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Я не совсем уверен, что вы ищете. Я предполагаю, что вы хотите, чтобы кнопка увеличивалась/сжималась по мере переноса или не переноса текста.

В этом случае вам следует привязать высоту к 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>

Вряд ли когда-либо возникнет необходимость привязывать ширину/высоту элемента к ActualWidth/ActualHeight родительского или дочернего элемента. Все это делается с помощью обычного макета. Все, что вам нужно сделать, это сбросить значение свойства Height по умолчанию — именно это и просил OP.

Clemens 20.06.2024 19:56

Стритер, ты прав. Как сказал Клеменс, это делается по умолчанию, и я хочу использовать это поведение по умолчанию. Тем не менее, спасибо за ответ!

Daimonion 21.06.2024 07:27
Ответ принят как подходящий

Значением свойств 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 размер кнопки изменяется в соответствии с высотой ее содержимого! Это то, что мне нужно.

Daimonion 21.06.2024 07:25

Другие вопросы по теме