7

私はControlTemplateいくつかPathの s を含む を持っています。Paths を伸ばして、 a などのコントロールを塗りつぶしたいと思い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のサイズを比例的にスケーリングしただけです。StrechXStretchYPath

値コンバーターを使用しますか? それとも、親のサイズに何らかの形で相対的にバインドされているのでしょうか?

4

2 に答える 2

12

あなたの例で Canvas の周りに ViewBox を投げるとうまくいくはずです。

于 2009-07-16T20:24:33.183 に答える
5

Path を伸ばすには、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 に答える