My Silverlight系列(11)—— Silverlight中的右键事件点击模拟(全局版本)
2009-04-25 12:04:33 来源:WEB开发网这样,余下的工作就可以通过Silverlight中ManagedCode同Javascript的操作来实现了。在这里,首先提出一个类,它能帮助我们计算出任何一个UIElement从Application的RootVisual的平移值。这个类我写成了静态类,并且写成Extension Method,其实用普通的静态类,同样也是可行的。
1 public static class GlobalTransform
2 {
3 private static readonly Point Origin = new Point(0, 0);
4 public static Point TransformFromRootVisual(this UIElement element)
5 {
6 UIElement uiElement = Application.Current.RootVisual;
7 if (uiElement == null)
8 throw new InvalidOperationException();
9 MatrixTransform globalTransform = (MatrixTransform)element.TransformToVisual(uiElement);
10 Point p = globalTransform.Matrix.Transform(Origin);
11 return p;
12 }
13 }
然后,我介绍一下EventArgs类。其实这个类,只不过是传递了鼠标在Silverlight Application上点击点的绝对定位值,为了方便起见,我在里面加入了几个方法,包括命中测试和被点击到的所有UIElement的可遍历集合。
1public sealed class MouseRightClickEventArgs : EventArgs
2 {
3 internal MouseRightClickEventArgs(double x, double y)
4 {
5 m_XOffset = x;
6 m_YOffset = y;
7 }
8
9 private double m_XOffset;
10 private double m_YOffset;
11
12 public Point GetPosition(UIElement relativeTo)
13 {
14 if (relativeTo != null)
15 {
16 Point p = relativeTo.TransformFromRootVisual();
17 return new Point(m_XOffset - p.X, m_YOffset - p.Y);
18 }
19 return new Point(m_XOffset, m_YOffset);
20 }
21
22 public IEnumerable<UIElement> FindElementsInHitPoint()
23 {
24 return VisualTreeHelper.FindElementsInHostCoordinates(GetPosition(null), Application.Current.RootVisual);
25 }
26
27 public bool HitTest(UIElement relativeTo)
28 {
29 foreach (UIElement element in FindElementsInHitPoint())
30 {
31 if (element == relativeTo)
32 return true;
33 }
34 return false;
35 }
36
37 private bool m_Handled;
38 // Summary:
39 // If you don't want to see the Silverlight Configuration,
40 // set it as true
41 public bool Handled
42 {
43 get { return this.m_Handled; }
44 set { this.m_Handled = value; }
45 }
46 }
Tags:My Silverlight 系列
编辑录入:爽爽 [复制链接] [打 印]更多精彩
赞助商链接