我正在编写一个显示XAML对象的WPF应用程序(它基本上是在XAML中绘制的地图)。作为其功能的一部分,它应该放大/缩小和平移。平移工作正常,缩放变焦,但我不太明白如何缩放到特定点,例如我的鼠标光标。
这是我目前的代码:
internal void PerformZoom(float ZoomFactor, Point ZoomCenterPoint)
{
m_originalTransform = m_canvas.RenderTransform;
float newZoomFactor = m_oldZoomFactor + ZoomFactor;
float scaleToApply = (newZoomFactor / m_oldZoomFactor);
m_totalZoom = newZoomFactor;
var st = new ScaleTransform(scaleToApply, scaleToApply);
TransformGroup tg = new TransformGroup();
tg.Children.Add(m_originalTransform);
tg.Children.Add(st);
m_canvas.RenderTransform = tg;
m_oldZoomFactor = newZoomFactor;
}
[edit] 找到解决方案 - 刚刚编辑了转换的CenterX / CenterY属性,它就像一个魅力。 谢谢你的帮助!
[edit2] 这是一个可行的解决方案(考虑鼠标位置):
public partial class MainWindow
{
private float currentZoom = 1f;
private const float StepSize = .2f;
public MainWindow()
{
InitializeComponent();
}
private void MainGrid_OnMouseWheel(object sender, MouseWheelEventArgs e)
{
var pos = 1;
if (e.Delta < 0)
{
pos = -1;
}
var mousePosition = e.MouseDevice.GetPosition(MainGrid);
currentZoom += StepSize * pos;
var transform = new ScaleTransform(currentZoom, currentZoom, mousePosition.X, mousePosition.Y);
MainGrid.RenderTransform = transform;
}
}
答案 0 :(得分:2)
您必须使用TranslateTransform组合ScaleTransform,以便在缩放时平移组件。
TranslateTransform给出的偏移量取决于您想要的行为(即鼠标中心,屏幕中心......)
我在过去写过一个你可以附加到组件的行为:它使它可以缩放(以鼠标为中心,对鼠标滚轮作出反应) 它非常脏,不确定是否有效(我不再使用它)...评论用法语: - /
[edit] 事实上,我记得是滚动和缩放Panels背景。但是,将其应用于任何对象并不是很难修改,因为图像和元素的转换是相同的。