我是WPF的新手,在玩了相当多的游戏之后,我终于在我正在工作的项目上按照我喜欢的方式安排了我的控件。我有一个显示图像的矩形。鼠标滚轮使用ScaleTransform动画缩放图像,鼠标单击/拖动可在屏幕上移动图像。问题是,如果我放大或缩小图像,然后尝试移动它,它会自动将自己缩放回1(原始大小)。当它被缩放时,有没有办法移动它?编辑:我尝试将ScaleTransform和TranslateTransform设置为TransformGroup,但仍然不起作用。
我遇到的另一个问题是,如果图像比父容器大,它就会超出边界,我尝试在父容器上设置ClipToBounds = True,但不起作用。
代码:
private void Window_MouseWheel_1(object sender, MouseWheelEventArgs e)
{
if (e.Delta > 0)
{
ScaleTransform scaleP = new ScaleTransform();
scaleP.CenterX = e.GetPosition(this).X;
scaleP.CenterY = e.GetPosition(this).Y;
rect.RenderTransform = scaleP;
DoubleAnimation dblAnimX = new DoubleAnimation();
dblAnimX.From = scaleXFrom;
dblAnimX.To = scaleXTo + 0.1;
scaleXFrom = scaleXTo +0.1;
scaleXTo += 0.1;
Duration = new Duration(TimeSpan.FromSeconds(0.15));
DoubleAnimation dblAnimY = new DoubleAnimation();
dblAnimY.From = scaleYFrom;
dblAnimY.To = scaleYTo + 0.1;
scaleYFrom = scaleYTo +0.1;
scaleYTo += 0.1;
Duration = new Duration(TimeSpan.FromSeconds(0.15));
scaleP.BeginAnimation(ScaleTransform.ScaleXProperty, dblAnimX);
scaleP.BeginAnimation(ScaleTransform.ScaleYProperty, dblAnimY);
}
else
{
ScaleTransform scaleM = new ScaleTransform();
scaleM.CenterX = e.GetPosition(this).X;
scaleM.CenterY = e.GetPosition(this).Y;
rect.RenderTransform = scaleM;
DoubleAnimation dblAnimX = new DoubleAnimation();
dblAnimX.From = scaleXFrom;
dblAnimX.To = scaleXTo -0.1;
scaleXFrom = scaleXTo -0.1;
scaleXTo -= 0.1;
dblAnimX.Duration = new Duration(TimeSpan.FromSeconds(0.15));
DoubleAnimation dblAnimY = new DoubleAnimation();
dblAnimY.From = scaleYFrom;
dblAnimY.To = scaleYTo - 0.1;
scaleYFrom = scaleYTo -0.1;
scaleYTo -= 0.1;
Duration = new Duration(TimeSpan.FromSeconds(0.15));
scaleM.BeginAnimation(ScaleTransform.ScaleXProperty, dblAnimX);
scaleM.BeginAnimation(ScaleTransform.ScaleYProperty, dblAnimY);
}
}
private void rect_MouseMove_1(object sender, MouseEventArgs e)
{
if (e.LeftButton == MouseButtonState.Pressed)
{
System.Windows.Point p = e.GetPosition(this);
TranslateTransform tt = new TranslateTransform();
tt.X = (p.X - mouseDownX);
tt.Y = (p.Y - mouseDownY);
rect.RenderTransform = tt;
}
}发布于 2013-01-06 05:33:57
或者您使用MatrixTransform
var matrix = Matrix.Identity;
matrix.Scale(1.5, 2.5);
matrix.Translate(30, 60);
rect.RenderTransform = new MatrixTransform(matrix);或者甚至更短:
var matrix = new Matrix(1.5, 0, 0, 2.5, 30, 60);
rect.RenderTransform = new MatrixTransform(matrix);或者更好的是,您可以避免每次都设置一个新的RenderTransform,而只更新转换矩阵:
// set RenderTransform once in constructor
rect.RenderTransform = new MatrixTransform()
...
// update matrix in event handler
((MatrixTransform)rect.RenderTransform).Matrix = new Matrix(...);发布于 2013-01-06 03:26:43
由于您提供的代码太长,我没有将下面的示例改编为适合您的情况。如果可以,请考虑只发布它的关键部分。
要组合不同类型的Transform,可以通过这种方式使用TransformGroup。
void Button_Click_1(object sender, RoutedEventArgs e)
{
var button = sender as Button;
var transformGroup = new TransformGroup();
var scale = new ScaleTransform(1.5, 2.5);
var translate = new TranslateTransform(30, 60);
transformGroup.Children.Add(scale);
transformGroup.Children.Add(translate);
button.RenderTransform = transformGroup;
}发布于 2019-03-27 05:14:28
我也在尝试使用带有鼠标事件的MatrixTransform,并成功地让它像这样工作:
public partial class MainWindow : Window
{
....
// MyMatrixTransform could directly be defined in the xaml file
private MatrixTransform MyMatrixTransform = new MatrixTransform();
public MainWindow()
{
InitializeComponent();
MyMatrixTransform= new MatrixTransform();
// MyCanvasArea is a canvas defined in the xaml file
MyCanvasArea.RenderTransform = MyMatrixTransform;
.....
}
// canvas_MouseWheel is attached to canvas in the xaml file as follow
// <Canvas x:Name="MyCanvasArea" MouseWheel="canvas_MouseWheel" />
void canvas_MouseWheel(object sender, MouseWheelEventArgs e)
{
if (e.Delta > 0)
{
Matrix matrix = MyMatrixTransform.Matrix;
matrix.Scale(1.1, 1.1);
MyMatrixTransform.Matrix = matrix;
}
else
{
Matrix matrix = MyMatrixTransform.Matrix;
matrix.Scale(0.9, 0.9);
MyMatrixTransform.Matrix = matrix;
}
}
....
}可以直接访问MatrixTransform中的矩阵字段,但我找不到方法。
https://stackoverflow.com/questions/14175404
复制相似问题