Триггер стиля WPF

Я изменяю размер шрифта текста в триггере стиля, это приводит к изменению размера элемента управления, содержащего текст. Как я могу изменить размер шрифта, не влияя на размер родителя?

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

Ответы 6

Какой контроль вы используете? Если это HeaderedControl, например GroupBox или TabItem, вам нужно специально установить HeaderTemplate следующим образом:

<DataTemplate x:Key = "MyHeaderTemplate">
  <TextBlock Text = "{Binding}" Fontsize = "14" FontWeight = "Bold" />
</DataTemplate>

Я могу придумать пару вещей, которые вы могли бы попробовать:

  • Вы можете переопределить проход измерения элемента управления - когда элемент управления отображается в WPF, он проходит два прохода. Первый - это «проход измерения», когда элемент управления определяет размер хочет быть. Второй - это «аранжировка прохода», где фактически размещается элемент управления. WPF предоставляет метод под названием MeasureOverride.. Если вы переопределите этот метод, вы можете предоставить настраиваемое поведение, которое можно использовать для настройки размера элемента управления.

    Примечание - Я считаю, что вам нужно будет вызвать метод Measure для всех ваших дочерних элементов управления во время этого переопределения, чтобы ваш элемент управления размещался правильно.

  • Жестко закодируйте высоту и ширину элемента управления - это заменит DesiredSize элемента управления вашими значениями. Хотя, как правило, это не самая лучшая идея, но она сработает.

Я создаю ControlTemplate для ButtonControl, чтобы он выглядел как метка (плоский текст, без границ) с триггерами для IsKeyboardFocused, IsPressed, IsDefaaled и т. д.

IsPressed настроен на снижение FontSize (по умолчанию 30) до 28. Для создания эффекта анимации при нажатии.

Одно из применений этих кнопок - это горизонтальная панель StackPanel of Button, разделенная вертикальными разделителями. Когда триггер IsPressed срабатывает на кнопке и ее размер изменяется, весь ряд кнопок повторно настраивается, что не является приятным визуальным эффектом.

Я предпочитаю решение на основе шаблонов, чтобы не вводить новые элементы управления для переопределения. Единственная проблема с жестко заданным размером - интернационализация, другие языки увеличивают исходный размер.

Решение, которое я выберу, - установить minWidth в C# после вычисления DesiredSize кнопки. Обратите внимание, что ширина равна NaN даже после рендеринга кнопки, следовательно, используется / существует DesiredSize. Позже я попробую XAMLize C#.

Вы можете увеличить Padding одновременно с уменьшением FontSize - это приведет к тому, что вычисленная высота кнопки останется прежней:

<StackPanel>
    <Button Content = "ABC">
        <Button.Style>
            <Style TargetType = "{x:Type Button}">
                <Setter Property = "FontSize" Value = "20"/>
                <Style.Triggers>
                    <Trigger Property = "IsPressed" Value = "True">
                        <Setter Property = "FontSize" Value = "12"/>
                        <Setter Property = "Padding" Value = "5"/>
                    </Trigger>
                </Style.Triggers>
            </Style>
        </Button.Style>
    </Button>
    <Button Margin = "0,20" Content = "123" FontSize = "20"/>
    <Button Content = "Do Re Mi" FontSize = "20"/>
</StackPanel>

Вы можете сделать обратное и установить отрицательное значение Padding, если FontSize также увеличивается.

Вы также можете использовать привязку от FontSize к Padding, чтобы выполнить то же самое в общем случае, но если вы имеете дело только с фиксированным набором FontSizes, было бы проще просто жестко закодировать его, как указано выше.

Хороший трюк, позволяющий изолировать элемент от его родительского макета, - это поместить элемент в Canvas.

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

<Parent>
  <Grid>
    <Element Visibility = "Hidden"/>
    <Canvas>
      <Element />
    </Canvas>
  <Grid>
</Parent>

Абсолютно НЕТ необходимости в жестко заданной ширине, сумасшедших переопределениях размеров, сложных привязках или чему-либо в этом роде.

Решение на самом деле невероятно простое. Вместо изменения размера шрифта в триггере стиля создайте простой шаблон элемента управления для кнопки с применением RenderTransform к элементу презентатора содержимого. Добавьте ScaleTransform в RenderTransform. Внутри определения триггера IsPressed установите меньшее соотношение вертикального и горизонтального масштабов ScaleTransform, например 0,8.

Использование RenderTransform сохранит макет нажатой кнопки таким же, как и, поэтому он не повлияет на положение других элементов. Напротив, использование LayoutTransform фактически привело бы к сжатию контейнера кнопки, а метод ArrangeOverride родительского контейнера заставил бы соседние кнопки перемещаться, чтобы заполнить дополнительное пространство.

Я сейчас очень занят, поэтому оставлю фактическую реализацию на ваше усмотрение! ;-)

http://msdn.microsoft.com/en-us/library/system.windows.media.scaletransform.aspx

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