假设您在装饰器中有拇指用于拖动/旋转等,您首先要阻止它们缩放,以便在 GetDesiredTransform 覆盖中执行此操作。应用您在框架元素上应用的比例的倒数。这使您的拇指在调整大小时不会缩放。
public override GeneralTransform GetDesiredTransform(GeneralTransform transform)
{
double scaleFactor = GetCurrentScaleFactor(this._parent);
if (this._visualChildren != null)
{
foreach (var thumb in this._visualChildren.OfType<Thumb>())
{
thumb.RenderTransform
= new ScaleTransform(1 / scaleFactor , 1 / scaleFactor );
thumb.RenderTransformOrigin = new Point(0.5, 0.5);
}
}
return base.GetDesiredTransform(transform);
}
下一个问题将是排列拇指,以便它们在缩放/旋转等之后最终位于正确的位置。由于您已经更改了拇指的渲染变换,您现在还必须使用 ArrangeOverride 手动排列它。
为此,请列出所有拇指以及它们应该处于的位置。如果您只处理方形元素,那么您的工作就完成了一半,因为您只需要处理角落和侧面。
protected override Size ArrangeOverride(Size finalSize)
{
var adornedElement = this.AdornedElement as FrameworkElement;
// Use the width/height etc of adorned element to arrange the thumbs here
// Its been a long time so either its width/height or actualwidth/actualheight
// you will need to use.
this._leftTopThumb.Arrange(Get the Rect To arrange here);
this._rightTopThumb.Arrange(Get the Rect To arrange here);
// etc
return finalSize;
}
如果您不知道如何安排工作,请参阅此代码项目文章。
如果您仍然无法让它工作,请向我们展示可能导致问题的相关代码(不是 Visual Studio 解决方案),我相信有人会帮助您。
编辑
首先简化您的代码以了解您的问题。
- 删除除 btmRight thumb 之外的所有拇指和事件处理程序。
- 将 DragCompleted 事件添加到 btmRight Thumb。(删除拖动增量)
本质上,问题代码的症结归结为注释行:
void _btmRight_DragCompleted(object sender, DragCompletedEventArgs e)
{
var adornedElement = AdornedElement as FrameworkElement;
var hitThumb = sender as Thumb;
if (adornedElement == null || hitThumb == null) return;
var transformGroup = new TransformGroup();
transformGroup.Children.Add(adornedElement.RenderTransform);
//---- This is the problem line
transformGroup.Children.Add(new ScaleTransform(1 + e.HorizontalChange / adornedElement.Width, 1 + e.VerticalChange / adornedElement.Height));
//-------------------------------
adornedElement.RenderTransform = new MatrixTransform(transformGroup.Value);
}
现在很容易找出问题所在。这段代码在您第一次拖动和调整大小时效果很好。这是因为 adornedElement.Width 和 adornedElement.Height 在您第一次拖动它时是正确的,因为尚未应用任何缩放变换。拖动完成后,您假设宽度和高度现在将是新的宽度和高度。他们不是!你看这只是一个渲染变换,它不会改变元素的宽度或高度。它只是使它更大。
所以你需要做的是首先将现有的比例变换应用于 Width 和 Height 以获得渲染的宽度和高度。然后使用这些新值计算比例变换并添加到变换组。然后你会得到你想要的。
在 DragDelta 中执行此操作时,您很可能还会遇到其他问题。但在这种情况下,你应该只用一小部分相关代码提出一个更具体的问题,我相信你会在几分钟内得到某人的答案。