




Какой контроль вы используете? Если это 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