我在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>
有什么想法吗?我在绘图工具中看到过这样的东西,你可以选择一个项目并旋转它。
答案 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;
}
}