Silverlight通过X,Y模拟鼠标点击?

时间:2011-06-09 19:09:16

标签: silverlight silverlight-4.0

如果有一种方法可以按位置以编程方式发送鼠标点击事件,那将会很棒,但如果另一种方法可以解决以下问题,那么它也可以。

在我的情况下,我得到一个占用整个应用程序大小的画布(完全覆盖它),当用户用鼠标点击它时我想隐藏它,然后通过鼠标点击(从用户获取它的位置x& y)对于画布下的任何东西(在我的情况下,画布可见性会折叠,因此现在可以看到它下面的控件)。

我猜这是不可能的,因为运行Silverlight全屏等某些功能只能在按钮点击处理程序中完成(如果我错了,请纠正我)。

但是,有什么地方可以阅读有关Silverlight UI的基于安全性的限制吗?

1 个答案:

答案 0 :(得分:0)

你必须add an click event handler to your canvas。在此处理程序中,您可以获得点击的x和y位置(通过MouseButtonEventArgs),然后您可以使用VisualTreeHelper获取“点击元素”。

让我们假设以下xaml:

 <Grid x:Name="LayoutRoot" Background="White">
        <Button  Width="50" Height="50" VerticalAlignment="Top" HorizontalAlignment="Left"/>
        <TextBox Text="MyText" Width="200" Height="100" VerticalAlignment="Top" HorizontalAlignment="Left"/>
        <Canvas Background="Red"  x:Name="MyCanvas"  />
    </Grid>

后面带有以下代码:

    public MainPage()
            {
                InitializeComponent();
                MyCanvas.AddHandler(MouseLeftButtonUpEvent, new MouseButtonEventHandler(handler), true);
            }

            void handler(object sender, MouseButtonEventArgs e)
            {
                var point = new Point(e.GetPosition(this).X, e.GetPosition(this).Y);
                var elements = VisualTreeHelper.FindElementsInHostCoordinates(point, this);
                foreach (var uiElement in elements)
                {
                    if (uiElement is TextBox){
                      ((TextBox) uiElement).Focus();
                      break;
                    }
                    if(uiElement is Button)
                    {
                      //do button stuff here
                      break;
                    }
                }
                MyCanvas.Visibility = Visibility.Collapsed;
                MyCanvas.RemoveHandler(MouseLeftButtonUpEvent, new MouseButtonEventHandler(handler));
            }

但是:在这个简单的例子中,你得到大约20个命中元素。但它们按正确的“z-Index”排序。所以你可以遍历它,第一个有趣的元素是你可以破解的地方(也许你可以用LINQ做到这一点)。所以对我来说,我知道第一个命中TextBox是我想要关注的。

这是你需要的吗?

BR,

TJ