WPF路径大小调整问题

时间:2011-03-20 22:57:00

标签: wpf path size shape

嘿伙计们,我一直在玩WPF的Path形状,但我对某些行为感到有些恼火。 具体来说,路径不会像我希望的那样自行调整大小。如果你看下面的图像,我想要的是整个路径都在白色方块内(代表路径控制的边界),但弧线有点悬而未决。我认为这是因为Path根据用于绘制形状的点来调整自身大小,而不是根据实际绘制的形状。

我的问题是:有谁知道如何克服这个问题?我的意思是,除了明确设置路径的尺寸。是否有一些我忽略的选项,以便根据形状获得尺寸的路径,而不是根据用于制作形状的点?谢谢你的回答。

My path problem with data bindings My path problem with mini-language


这是两个版本的(应该是)等效代码:

1)首先,使用数据绑定(以非常详细的方式写出):

<UserControl x:Class="OrbitTrapWpf.LineSegmentTool"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
         xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
         xmlns:local="clr-namespace:OrbitTrapWpf"
         mc:Ignorable="d" 
         d:DesignHeight="300" d:DesignWidth="300"
         x:Name="Root" Background="White">
<UserControl.Resources>
    <local:ArcSizeConverter x:Key="ArcSizeConverter"/>
    <local:ArcPointConverter x:Key="ArcPointConverter"/>
</UserControl.Resources>
<Path Name="path" Stroke="Black">
  <Path.Data>
    <PathGeometry>
      <PathGeometry.Figures>
        <PathFigureCollection>
          <PathFigure IsClosed="True">
            <PathFigure.StartPoint>
              <Binding ElementName="Root" Path="point0"></Binding>
            </PathFigure.StartPoint>
            <PathFigure.Segments>
              <PathSegmentCollection>
                <ArcSegment SweepDirection="Counterclockwise" >
                  <ArcSegment.Size>
                    <Binding ElementName="Root" Path="Radius" Converter="{StaticResource ArcSizeConverter}"/>
                  </ArcSegment.Size>
                  <ArcSegment.Point>
                    <Binding ElementName="Root" Path="point1" />
                  </ArcSegment.Point>
                </ArcSegment>
                <LineSegment>
                  <LineSegment.Point>
                    <Binding ElementName="Root" Path="point2" />
                  </LineSegment.Point>
                </LineSegment>
                <ArcSegment SweepDirection="Counterclockwise">
                  <ArcSegment.Size>
                    <Binding ElementName="Root" Path="Radius" Converter="{StaticResource ArcSizeConverter}"/>
                  </ArcSegment.Size>
                  <ArcSegment.Point>
                    <Binding ElementName="Root" Path="point3" />
                  </ArcSegment.Point>
                </ArcSegment>
              </PathSegmentCollection>
            </PathFigure.Segments>
          </PathFigure>
        </PathFigureCollection>
      </PathGeometry.Figures>
    </PathGeometry>
  </Path.Data>
</Path>

2)这一个,使用迷你语言:

<UserControl x:Class="OrbitTrapWpf.LineSegmentTool"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
         xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
         xmlns:local="clr-namespace:OrbitTrapWpf"
         mc:Ignorable="d" 
         d:DesignHeight="300" d:DesignWidth="300"
         x:Name="Root" Background="White">
<UserControl.Resources>
    <local:ArcSizeConverter x:Key="ArcSizeConverter"/>
    <local:ArcPointConverter x:Key="ArcPointConverter"/>
</UserControl.Resources>
  <Grid Name="grid">
  <Path Name="path" Stroke="Black" Data="M 0.146446609406726,1.14644660940673 A 0.5,0.5 0 1 0 0.853553390593274,1.85355339059327 L 1.85355339059327,0.853553390593274 A 0.5,0.5 0 1 0 1.14644660940673,0.146446609406726 Z " />

我认为两者应该大致相同,但显然迷你语言版本的尺寸几乎是正确的,而原版则大不相同。

2 个答案:

答案 0 :(得分:3)

基本上,xaml所说的道路是:

  1. 从Point0开始,向Point1绘制一个弧。
  2. 从Point1,画一条线到Point2。
  3. 从Point2,绘制弧线到第3点。
  4. 'IsClosed'从Point3到Point0绘制另一条线。
  5. enter image description here

    你所定义的正是正在生成的东西 - 你可以改变它的唯一方法就是改变你的位置 - 但弧线仍然会延伸到X轴上的Point0之外,因为这就是你所定义的。

    如果你需要你的形状完全适合某个边界,你可以在你的形状周围放一个边框,边缘为半径(我确定有一个精确突出的公式)从右到右。

    由于第二个截图与第一个截图不同,我会得出结论,它们是不同的形状 - 这只能意味着路径数据的翻译不正确。

答案 1 :(得分:2)

好的,所以我找到了问题并解决了它。我在迷你语言版本中设置了IsLargeArc标志,而在纯XAML版本中,我将其保留为False。所以我把它改成True,我神奇地得到了我期望的结果。

这对我来说似乎是一个错误,因为在这种情况下,大弧和小弧是同一个,因为我画了一个半弧。如果有人知道这种行为的原因,那么听到它会很棒!