在WPF中绘制一个支持多个角度的三角形

时间:2012-05-23 12:21:22

标签: c# wpf xaml geometrydrawing

我正在使用GeometryDrawing在WPF中绘制一个三角形。我目前能够将它绑定到我的ViewModel的“角度”属性,该属性附加到用户可以移动的滑块,从而围绕对象移动矩形。问题是我想根据我计算的基于缩放值的特定角度使矩形也能够更宽或更窄。我目前无法更改矩形,因为我不知道如何在GeometryDrawing对象上执行此操作。也许应该使用另一个对象?

GeometryDrawing目标代码是:

<GeometryDrawing Geometry="M100,100 L186.6,280 A100,100,0,0,1,13.4,280 L100,100">
     <GeometryDrawing.Brush>
         <LinearGradientBrush StartPoint="0,0" EndPoint="0,1" Opacity="0.25">
               <GradientStopCollection>
                     <GradientStop Color="Black" Offset="0" />
                     <GradientStop Color="Transparent" Offset="0.9"/>
               </GradientStopCollection>
         </LinearGradientBrush>
     </GeometryDrawing.Brush>
</GeometryDrawing>

应用程序的UI就是这个(只有一个测试项目,我在实际项目中实现之前已经用它来测试控件)

The UI for the rectangle problem. The faded rectangle is the one in question

感谢所有帮助人员!

约翰。

2 个答案:

答案 0 :(得分:1)

您可以使用两个LineSegments和ArcSegment替换当前的Geometry绘图字符串。

<ArcSegment Size="100,50" 
            IsLargeArc="True" 
            SweepDirection="CounterClockwise" 
            Point="200,100" />

此外,对于视野而言,弧比三角形更自然,特别是当角度很大(接近180度)时。

修改

这比它看起来更难,因为你需要计算弧的终点。除了在代码中计算端点外,我没有看到其他解决方案。

答案 1 :(得分:0)

好的,我设法让弧打开和关闭。我这样做的方法是定义像这样的Arc的两行

<PathGeometry>
      <PathFigure StartPoint="50,0" IsClosed="True">
             <LineSegment Point="0,100" x:Name="m_leftLine" />
             <LineSegment Point="100,100" x:Name="m_rightLine" />
      </PathFigure>
</PathGeometry>

然后只为滑块的ValueChanged事件编写代码,并使用所需的角度重新计算线的X位置。这导致了以下代码:

public partial class MyFovControl : UserControl
{
private float m_oldAngleValue;
private float m_newAngleValue;

public MyFovControl()
{
  InitializeComponent();
  this.zoomSlider.ValueChanged += new RoutedPropertyChangedEventHandler<double>(zoomSlider_ValueChanged);
  m_oldAngleValue = m_newAngleValue = 0;
}

void zoomSlider_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e)
{
  m_newAngleValue = (float)(Convert.ToDouble((double)lblFovXAngle.Content));

  // Happens only once the first time.
  if (m_oldAngleValue == 0)
  {
    m_oldAngleValue = m_newAngleValue;
  }

  m_leftLine.Point = new Point(m_leftLine.Point.X + (m_oldAngleValue - m_newAngleValue), m_leftLine.Point.Y);
  m_rightLine.Point = new Point(m_rightLine.Point.X - (m_oldAngleValue - m_newAngleValue), m_rightLine.Point.Y);
  m_oldAngleValue = m_newAngleValue;
  }
}

我知道,非常麻烦,但这是我能想到的唯一方式以及我在网上搜索的内容 - 可能是唯一的方式。