用鼠标旋转文本框

时间:2014-01-14 20:35:33

标签: c# .net wpf

我在wpf用户控件中有一个文本框,当我点击屏幕时会在弹出窗口中显示。我试图让它成为用户可以抓住文本框或usercontrol的角落并用鼠标旋转它。

控件的要点是我已经为地图组件添加了一些绘图工具,这样用户就可以向地图添加文本了。我希望如果在文本框弹出时输入文本,他们也可以用鼠标旋转文本框。

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

有什么想法吗?我在绘图工具中看到过这样的东西,你可以选择一个项目并旋转它。

1 个答案:

答案 0 :(得分:0)

一个想法是向您的控件添加Thumb,并相应地修改RotateTransform。 Thumb包含DragStarted,DragDelta和DragCompleted事件,可用于获取旋转角度。

理想情况下,您可以将TextBox本身作为Thumb模板的一部分 - 这样,您可以将旋转变换直接应用于Thumb.RenderTransform,然后将{Text}旋转。拇指本身。

编辑这是一个匆匆拼凑的例子。

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