2011-04-21 61 views
2

我可能已经梦想了,但我记得我读过的地方可以使用缩放变换来更改边框的大小,并且有一个属性可以保留边框宽度与使用比例尺之前的情况(我可能梦想的是这个属性,而不是比例变换= P)。使用缩放变换时的边框保持比率

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

任何人都知道如何做到这一点?

谢谢!

回答

3

当然,只是layout-transform将一个零宽度的边框缩放为任意大小,然后用一个像素宽度的边框包裹起来。

<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> 

编辑:

OK,采取两种当缩放外部进来的。

这里是用帆布一点标记演示所转化含边界:

<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(); 
    } 
} 

注意,转换器不稳健并且只是出于演示的目的。

+0

这是一个有趣的方法。它可以工作,但问题是我的边框位于画布内部,并且正在转换的是画布,因此,将1个厚度边框放在边框外部会产生相同的结果。也许我应该已经具体说明了这一点。感谢您的建议! – Carlo 2011-04-21 22:48:19

+0

为您的情况添加了一种方法。 – 2011-04-21 23:22:44

+0

哈哈真好!我会在接下来的一小时内尝试并回复你。谢谢! – Carlo 2011-04-22 00:10:17