0

我有一个场景,我想在 Button 控件获得焦点时减少它的边距。这是因为我不想增加该 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;
}

上面的代码导致堆栈溢出异常,因为 Margin.Left 被递归调用。对于我想要实现的场景,任何人都有更好的想法或实现。

4

1 回答 1

0

您将希望对边距使用 ThicknessAnimation,对高度/宽度使用 DoubleAnimation,而不是使用转换器。

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

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

例子:

<StackPanel>
    <StackPanel.Resources>
        <Thickness x:Key="unfocusedThickness" Top="15" Left="15" Right="15" Bottom="15"/>
        <Thickness x:Key="focusedThickness" Top="5" Left="5" Right="5" Bottom="5"/>
    </StackPanel.Resources>
    <Button Height="100" Width="100" Margin="15">
        <Button.Triggers>
            <EventTrigger RoutedEvent="Button.GotFocus">
                <BeginStoryboard>
                    <Storyboard>
                        <DoubleAnimation Storyboard.TargetProperty="Height" From="100" To="120" Duration="0:0:0"/>
                        <DoubleAnimation Storyboard.TargetProperty="Width" From="100" To="120" Duration="0:0:0"/>
                        <ThicknessAnimation Storyboard.TargetProperty="Margin" From="{StaticResource unfocusedThickness}" To="{StaticResource focusedThickness}" Duration="0:0:0"/>
                    </Storyboard>
                </BeginStoryboard>
            </EventTrigger>
            <EventTrigger RoutedEvent="Button.LostFocus">
                <BeginStoryboard>
                    <Storyboard>
                        <DoubleAnimation Storyboard.TargetProperty="Height" From="120" To="100" Duration="0:0:0"/>
                        <DoubleAnimation Storyboard.TargetProperty="Width" From="120" To="100" Duration="0:0:0"/>
                        <ThicknessAnimation Storyboard.TargetProperty="Margin" To="{StaticResource unfocusedThickness}" From="{StaticResource focusedThickness}" Duration="0:0:0"/>
                    </Storyboard>
                </BeginStoryboard>
            </EventTrigger>
        </Button.Triggers>
    </Button>
    <TextBox />
</StackPanel>
于 2012-03-28T16:52:09.750 回答