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