7

我有一个,里面ControlTemplate有一些Paths。我希望Paths 拉伸并填充它们所在的控件,例如Button. 我怎样才能做到这一点?

我目前的样子是这样的:

<ControlTemplate x:Key="SomeTemplate" TargetType="Button">
    <Canvas Background="AliceBlue">
        <Path Data="M 99.5,50 A 49.5,49.5 0 1 1 0.5,50 A 49.5,49.5 0 1 1 99.5,50 z"
            Fill="White" Stroke="Black" StrokeThickness="1" />
        <Path Data="M 15,50 C 17.5,22.5 47.5,22.5 50,50 C 52.5,77.5 82.5,77.5 85,50"
            Stroke="Black" StrokeThickness="1" />
    </Canvas>
</ControlTemplate>

...

<Button Template="{StaticResource SomeTemplate}" Height="120" Width="120" />

我知道ScaleTransform'StrechXStretchY属性,但它们只是原始Path大小的比例缩放。

我会使用价值转换器吗?或者也许某种形式的相对绑定到父母的大小?

4

2 回答 2

12

在您的示例中,在 Canvas 周围放置一个 ViewBox 应该可以。

于 2009-07-16T20:24:33.183 回答
5

要拉伸路径,请使用该Stretch属性。它就像图像拉伸一样工作 - 在这里描述:https ://msdn.microsoft.com/en-us/library/system.windows.media.stretch(v= vs.110).aspx (System.Windows.Media > Stretch枚举)。在下面显示的情况下,将值设置为Uniform将保留填充它所占据的控件的路径宽高比,以便整个路径可见。

<Path Stretch="Uniform" Data="..."/>

有一个副作用:以这种方式拉伸路径将“规范化”其数据,即即使写入数据以便所有点都从原点 [ 1 ] 进行变换,当拉伸变换被省略时 [ 2 ] (希望我能清楚地解释这一点)。

例如,当有来自 Inkscape 的凌乱对象(未转换为原点)时,您可以利用它来发挥您的优势,而不用担心转换后的数据。

拉伸=

<Grid Width="200" Height="200">
  <TextBlock Text="(0,0)" />
  <TextBlock Text="(200,200)" VerticalAlignment="Bottom" HorizontalAlignment="Right"/>
  <Path Stroke="Blue" Stretch="None" Fill="Beige" Data="M 63,50 82,86 107,62 84,65 Z"/>
  <Rectangle Stroke="Red" StrokeThickness="1"/>
</Grid>

拉伸=

<Grid Width="200" Height="200">
  <TextBlock Text="(0,0)" />
  <TextBlock Text="(200,200)" VerticalAlignment="Bottom" HorizontalAlignment="Right"/>
  <Path Stroke="Blue" Stretch="Uniform" Fill="Beige" Data="M 63,50 82,86 107,62 84,65 Z"/>
  <Rectangle Stroke="Red" StrokeThickness="1"/>
</Grid>
于 2015-12-08T11:56:14.820 回答