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

C# 在WPF中绘制支持多个角度的三角形,c#,wpf,xaml,geometrydrawing,C#,Wpf,Xaml,Geometrydrawing,我正在使用几何绘图在WPF中绘制一个三角形。我目前可以将其绑定到ViewModel的“角度”属性,该属性附加到用户可以移动的滑块上,从而移动对象周围的矩形。问题是,我想使矩形也能够根据基于缩放值计算的特定角度变宽或变窄。我目前无法更改矩形,因为我不知道如何在GeometryDrawing对象上执行此操作。也许应该使用另一个对象 GeometryDrawing对象代码如下: <GeometryDrawing Geometry="M100,100 L186.6,280 A100,10

我正在使用
几何绘图
在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是这样的(只是一个测试项目,在我在实际项目中实现控件之前,我已经做了测试)

谢谢大家的帮助


John。

您可以用两条线段和一条线替换当前几何图形图形字符串


此外,对于视野而言,圆弧比三角形更自然,尤其是当角度较大(接近180度)时

编辑


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

好的,我已经设法使弧打开和关闭。我这样做的方法是这样定义两条弧线

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

我知道,非常梅西,但这是我能想到的唯一方法,也是我在网上搜索到的唯一方法——可能是唯一的方法。

谢谢你的提示,Erno,我将查看此解决方案并尽快发布我的反馈。如何将两个
线段
对象连接到我的
弧段
?很抱歉,如果不使用一些计算弧点的代码,这似乎是不可能的。连接线和弧很容易;直线和圆弧从上一个位置继续,只需指定线段的端点,并将路径图的IsClosed设置为“True”(即保存直线)。
<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>
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;
  }
}