2012-05-23 243 views
0

我正在使用GeometryDrawing在WPF中繪製三角形。我目前能夠將它綁定到我的ViewModel的「角度」屬性,該屬性附加到用戶可以移動的滑塊,從而圍繞對象移動矩形。問題是,我想根據我計算的基於變焦值的特定角度使矩形也變得更寬或更窄。我目前無法對矩形進行更改,因爲我不知道如何在GeometryDrawing對象上執行此操作。也許應該使用另一個對象?在WPF中繪製一個支持多角度的三角形

的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

感謝您的所有幫助人員!

約翰。

回答

1

您可以用兩個LineSegments和ArcSegment替換當前的幾何繪圖字符串。

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

此外,弧對於視野比三角更自然,特別是當角度大(接近180度)時。

編輯

這是比看起來難,因爲你需要計算弧的終點。除了計算代碼中的端點外,我沒有看到任何其他解決方案。

+0

我更改了代碼以使用角度的綁定。 –

+0

感謝Erno的提示,我會盡快查看這個解決方案併發布我的反饋。如何將兩個'LineSegment'對象連接到我的'ArcSegment'? –

+1

我很抱歉,但是如果不使用計算圓弧點的代碼,這似乎是不可能的。連接線條和弧線很容易;直線和圓弧從前一個位置繼續,只需指定段的終點,並將PathFigure的IsClosed設置爲「True」(即保存一行)。 –

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

我知道,很梅西,但這是我能想到的和從我在網上搜的唯一途徑 - 可能存在的唯一途徑。