0

GeometryDrawingWPFで三角形を描画するためにを使用しています。現在、ユーザーが移動してオブジェクトの周りの長方形を移動できるスライダーにアタッチされているViewModelの「Angle」プロパティにバインドすることができます。問題は、ズーム値に基づいて計算した特定の角度に応じて、長方形を広くしたり狭くしたりできるようにすることです。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はこれです(テストプロジェクトのみで、実際のプロジェクトに実装する前にコントロールをテストするように作成しました)

長方形の問題のUI。 色あせた長方形が問題の長方形です

助けてくれてありがとう!

ジョン。

4

2 に答える 2

1

現在の Geometry 描画文字列を 2 つの LineSegments と ArcSegment に置き換えることができます

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

また、特に角度が大きい場合 (180 度近く) は、三角形よりも円弧の方が視野として自然です。

編集

円弧の終点を計算する必要があるため、これは見た目よりも困難です。コードでエンドポイントを計算する以外に解決策はありませんでした。

于 2012-05-23T12:33:09.803 に答える
0

わかりました、アークを開閉させることができました。私がこれを行った方法は、アークの両方の線をこのように定義することでした

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

私は知っている、非常にメッシですが、それが私が考えることができる唯一の方法であり、私がオンラインで検索したものから-おそらく存在する唯一の方法です.

于 2012-05-24T09:45:58.983 に答える