使用WPF我正在寻找一种方法,使用鼠标拖动边缘使拇指控制大小

我需要一个可以使用鼠标调整尺寸的拇指控件。 当用户将鼠标hover在其中一个末端上时,应显示一个大小的光标,当用户点击并拖动控件的末尾时,它将被重新resize。

我开始认为我应该创建一个由三个拇指控件创建的自定义控件。 将会有一个主拇指,然后每个端都有一个可以处理重新resize的拇指,但我认为这不是一个好的解决方案。

我认为更好的方法是使用单个Thumb控件,然后在鼠标hover的控件的末尾有一个重新resize的Adorner弹出窗口。 使用这种方法,您如何检测鼠标hover在控件的特定区域? 非常感谢如何执行此操作或任何帮助的示例。

这是我前一段时间做的一个,它允许MoveResize ,但你可以删除Move逻辑,它应该工作正常(风格仍然有点凌乱,但它工作得很好)

它基于ContentControl因此您可以在Canvas添加任何Element和在Canvas上移动/resize,它使用3个Adorners ,一个用于resize,一个用于移动,一个用于显示信息(当前大小)

如果你想测试/使用/修改/改进,这是一个完整的工作示例:)

码:

 namespace WpfApplication21 { ///  /// Interaction logic for MainWindow.xaml ///  public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); } } public class ResizeThumb : Thumb { public ResizeThumb() { DragDelta += new DragDeltaEventHandler(this.ResizeThumb_DragDelta); } private void ResizeThumb_DragDelta(object sender, DragDeltaEventArgs e) { Control designerItem = this.DataContext as Control; if (designerItem != null) { double deltaVertical, deltaHorizontal; switch (VerticalAlignment) { case VerticalAlignment.Bottom: deltaVertical = Math.Min(-e.VerticalChange, designerItem.ActualHeight - designerItem.MinHeight); designerItem.Height -= deltaVertical; break; case VerticalAlignment.Top: deltaVertical = Math.Min(e.VerticalChange, designerItem.ActualHeight - designerItem.MinHeight); Canvas.SetTop(designerItem, Canvas.GetTop(designerItem) + deltaVertical); designerItem.Height -= deltaVertical; break; default: break; } switch (HorizontalAlignment) { case HorizontalAlignment.Left: deltaHorizontal = Math.Min(e.HorizontalChange, designerItem.ActualWidth - designerItem.MinWidth); Canvas.SetLeft(designerItem, Canvas.GetLeft(designerItem) + deltaHorizontal); designerItem.Width -= deltaHorizontal; break; case HorizontalAlignment.Right: deltaHorizontal = Math.Min(-e.HorizontalChange, designerItem.ActualWidth - designerItem.MinWidth); designerItem.Width -= deltaHorizontal; break; default: break; } } e.Handled = true; } } public class MoveThumb : Thumb { public MoveThumb() { DragDelta += new DragDeltaEventHandler(this.MoveThumb_DragDelta); } private void MoveThumb_DragDelta(object sender, DragDeltaEventArgs e) { Control designerItem = this.DataContext as Control; if (designerItem != null) { double left = Canvas.GetLeft(designerItem); double top = Canvas.GetTop(designerItem); Canvas.SetLeft(designerItem, left + e.HorizontalChange); Canvas.SetTop(designerItem, top + e.VerticalChange); } } } public class SizeAdorner : Adorner { private Control chrome; private VisualCollection visuals; private ContentControl designerItem; protected override int VisualChildrenCount { get { return this.visuals.Count; } } public SizeAdorner(ContentControl designerItem) : base(designerItem) { this.SnapsToDevicePixels = true; this.designerItem = designerItem; this.chrome = new Control(); this.chrome.DataContext = designerItem; this.visuals = new VisualCollection(this); this.visuals.Add(this.chrome); } protected override Visual GetVisualChild(int index) { return this.visuals[index]; } protected override Size ArrangeOverride(Size arrangeBounds) { this.chrome.Arrange(new Rect(new Point(0.0, 0.0), arrangeBounds)); return arrangeBounds; } } } 

XAML:

                                                    

结果:

在此处输入图像描述在此处输入图像描述

内容内容(按钮)

在此处输入图像描述

抱歉,使用SnipTool时游标不显示