使用比例变换时的边界保持率

时间:2011-04-21 22:20:42

标签: wpf

我可能已经梦想过了,但我记得在某处我读到可以使用缩放变换来改变边框的大小,并且有一个属性可以保持边框宽度与使用前的宽度相同比例(我可能梦想的是这个属性,而不是比例变换= P)。

所以,通常情况下,如果我有一个BorderWidth为1的边框,并且我将其缩放以使其更大,则BorderWidth看起来像是10或者其他东西。我希望控件本身更大,但它的边框保持1像素宽度。

任何人都知道怎么做?

谢谢!

1 个答案:

答案 0 :(得分:3)

当然,只需布局转换,将零宽度边框缩放到您喜欢的任何尺寸,并将其包裹在一个像素宽的边框中。

<Grid>
    <Border BorderThickness="1" BorderBrush="Black" HorizontalAlignment="Left" VerticalAlignment="Top">
        <Border Height="100" Width="100">
            <Border.LayoutTransform>
                <ScaleTransform ScaleX="2" ScaleY="2"/>
            </Border.LayoutTransform>
            <TextBlock Text="Some text"/>
        </Border>
    </Border>
</Grid>

修改

好的,当外部进行缩放时,取两个。

这是一个小标记演示,其中一个画布正在被转换并包含一个边框:

<Grid>
    <Grid.Resources>
        <local:DescalingConverter x:Key="descalingConverter"/>
    </Grid.Resources>
    <Canvas Name="canvas">
        <Canvas.LayoutTransform>
            <ScaleTransform ScaleX="2" ScaleY="2"/>
        </Canvas.LayoutTransform>
        <Border BorderThickness="{Binding ElementName=canvas, Converter={StaticResource descalingConverter}}"
                BorderBrush="Black" Width="100" Height="100">
            <TextBlock Text="Some text"/>
        </Border>
    </Canvas>
</Grid>

这里是去扩展转换器:

public class DescalingConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        var element = value as FrameworkElement;
        var transform = element.LayoutTransform as ScaleTransform;
        if (transform == null) return 1.0;
        return 1.0 / transform.ScaleX;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

请注意,转换器不健壮,仅用于演示目的。