IsManipulationEnabled="True"
默认情况下,此属性为 false。对于您希望在其上获得多点触控输入并生成操作事件的任何元素,您必须将其设置为 true。
操作事件是 WPF 路由事件,这意味着这些事件会使可视化树浮现出来。在此程序中,Grid 和 MainWindow 的 IsManipulationEnabled 属性均未设置为 true,但您仍可将操作事件的处理程序附加至 Grid 和 MainWindow 元素,或者在 MainWindow 类中覆盖 OnManipulation 方法。
另请注意,每个 Image 元素将其 RenderTransform 设置为一个六位数的字符串:
RenderTransform="0.5 0 0 0.5 100 100"
这是设置已初始化的 MatrixTransform 对象的 RenderTransform 属性的快捷方式。在此特定示例中,设置为 MatrixTransform 的 Matrix 对象已经过初始化,可执行 0.5 个单位的缩放(使照片缩小至实际大小的一半)和朝右下方的 100 个单位的平移。该窗口的代码隐藏文件会访问并修改此 MatrixTransform。
图 3 显示了完整的 MainWindow.xaml.cs 文件,该文件仅覆盖两个方法,即 OnManipulationStarting 和 OnManipulationDelta。这些方法处理由 Image 元素生成的操作。
图 3 SimpleManipulationDemo 的代码隐藏文件
using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;
using System.Windows.Media;
namespace SimpleManipulationDemo {
public partial class MainWindow : Window {
public MainWindow() {
InitializeComponent();
}
protected override void OnManipulationStarting(
ManipulationStartingEventArgs args) {
args.ManipulationContainer = this;
// Adjust Z-order
FrameworkElement element =
args.Source as FrameworkElement;
Panel pnl = element.Parent as Panel;
for (int i = 0; i < pnl.Children.Count; i++)
Panel.SetZIndex(pnl.Children[i],
pnl.Children[i] ==
element ? pnl.Children.Count : i);
args.Handled = true;
base.OnManipulationStarting(args);
}
protected override void OnManipulationDelta(
ManipulationDeltaEventArgs args) {
UIElement element = args.Source as UIElement;
MatrixTransform xform =
element.RenderTransform as MatrixTransform;
Matrix matrix = xform.Matrix;
ManipulationDelta delta = args.DeltaManipulation;
Point center = args.ManipulationOrigin;
matrix.ScaleAt(
delta.Scale.X, delta.Scale.Y, center.X, center.Y);
matrix.RotateAt(
delta.Rotation, center.X, center.Y);
matrix.Translate(
delta.Translation.X, delta.Translation.Y);
xform.Matrix = matrix;
args.Handled = true;
base.OnManipulationDelta(args);
}
}
}