У меня есть сценарий, в котором я хочу уменьшить поля элемента управления Button, когда он получает фокус. Это потому, что я не хочу увеличивать свойство border этого элемента управления Button и в то же время не хочу, чтобы кнопка оставалась одинакового размера (высота и ширина). Поэтому небольшое усилие в Интернете заставило меня написать ValueConverter и уменьшить маржу. Но я до сих пор не могу поднять рабочий код. Вот что я перемешал
Xaml
<ControlTemplate.Triggers> <!--ControlTemplate for the Button-->
<Trigger Property="IsFocused" Value="True">
<Setter Property="BorderBrush" TargetName="bdrButton" Value="Wheat"/>
<Setter Property="BorderThickness" TargetName="bdrButton" Value="2"/>
<Setter Property="Margin" TargetName="bdrButton" >
<Setter.Value>
<Binding ElementName="bdrButton" Path="Margin" Converter="{StaticResource N_MarginReducer}">
<Binding.ConverterParameter>
<Thickness>1,1,1,1</Thickness>
</Binding.ConverterParameter>
</Binding>
</Setter.Value>
</Setter>
</Trigger>
</ControlTemplate.Triggers>
Преобразователь:
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) {
Thickness newMargin = new Thickness();
Thickness margin = (Thickness)value;
Thickness reduceBy = (Thickness)parameter;
newMargin.Left = margin.Left - reduceBy.Left;
newMargin.Top = margin.Top - reduceBy.Top;
newMargin.Right = margin.Right - reduceBy.Right;
newMargin.Bottom = margin.Bottom - reduceBy.Bottom;
return newMargin;
}
Приведенный выше код приводит к тому, что StackOverFlowException для Margin.Left вызывается рекурсивно. У любого есть лучшая идея или реализация для сценария, которого я пытаюсь достичь.