2014-01-14 89 views
1

我在一個wpf用戶控件中有一個文本框,當我單擊屏幕時在彈出框中顯示。我正在嘗試使用戶可以抓住文本框或用戶控件的角落並用鼠標旋轉它。用鼠標旋轉文本框

控件的要點是我在地圖組件中添加了一些繪圖工具,這樣用戶就可以向地圖添加文本。如果在文本框彈出時輸入文本,他們也可以用鼠標旋轉文本框。

<Popup Grid.Row="1" 
      Name="_drawText" 
      DataContext="{Binding Path=MapControlViewModel}" 
      IsOpen="{Binding IsTextDrawingSelected, Mode=OneWay}" 
      PopupAnimation="None" 
      AllowsTransparency="True"      
      Placement="Mouse"> 
      <map:TextBoxDrawingControl DataContext="{Binding TextBoxDrawingControlViewModel}"/> 
    </Popup> 

任何想法?我在繪圖工具中看到過這樣的東西,你可以選擇一個項目並旋轉它。

+0

我沒有時間進行全面的答案,但看一看[RotateTransform(HTTP:// msdn.microsoft.com/en-us/library/system.windows.media.rotatetransform(v=vs.110).aspx) –

回答

0

一個想法是將Thumb添加到您的控件,並相應地修改RotateTransform。 Thumb包含DragStarted,DragDelta和DragCompleted事件,您可以使用這些事件來獲取旋轉角度。

理想情況下,您將使TextBox本身成爲拇指模板的一部分 - 這樣,您可以將旋轉轉換直接應用於Thumb.RenderTransform,然後將該文本框與拇指本身一起旋轉。

編輯這是一個匆忙拼湊的例子。

用戶控件XAML:

<UserControl x:Class="Test.RotatableUserControl" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
     xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
     mc:Ignorable="d" 
     d:DesignHeight="300" d:DesignWidth="300"> 
<Grid> 
    <Thumb DragDelta="OnDragDelta" DragCompleted="OnDragCompleted" DragStarted="OnDragStarted"> 
     <Thumb.Template> 
      <ControlTemplate TargetType="Thumb"> 
       <Border Padding="5" Background="DarkGray" Cursor="ScrollAll"> 
        <TextBox Text="hello" /> 
       </Border> 
      </ControlTemplate> 
     </Thumb.Template> 
    </Thumb> 
</Grid> 
</UserControl> 

代碼隱藏:

public partial class RotatableUserControl : UserControl 
{ 
    private Point _center; 

    public RotatableUserControl() 
    { 
     InitializeComponent(); 
    } 

    public void OnDragStarted(object sender, DragStartedEventArgs e) 
    { 
     var thumb = (Thumb)sender; 
     _center = new Point(thumb.ActualWidth/2, thumb.ActualHeight/2); 
     thumb.RenderTransform = (thumb.RenderTransform as RotateTransform) ?? new RotateTransform(0, _center.X, _center.Y); 
    } 
    public void OnDragDelta(object sender, DragDeltaEventArgs e) 
    { 
     var thumb = (Thumb)sender; 
     var pos = Mouse.GetPosition(thumb); 
     var rotate = (RotateTransform)thumb.RenderTransform; 
     double angle = Math.Atan((pos.X-_center.X)/(pos.Y-_center.Y)); 
     rotate.Angle += angle; 
    } 
    public void OnDragCompleted(object sender, DragCompletedEventArgs e) 
    { 
     var thumb = (Thumb)sender; 
    } 
}