如果有一种方法可以按位置以编程方式发送鼠标点击事件,那将会很棒,但如果另一种方法可以解决以下问题,那么它也可以。
在我的情况下,我得到一个占用整个应用程序大小的画布(完全覆盖它),当用户用鼠标点击它时我想隐藏它,然后通过鼠标点击(从用户获取它的位置x& y)对于画布下的任何东西(在我的情况下,画布可见性会折叠,因此现在可以看到它下面的控件)。
我猜这是不可能的,因为运行Silverlight全屏等某些功能只能在按钮点击处理程序中完成(如果我错了,请纠正我)。
但是,有什么地方可以阅读有关Silverlight UI的基于安全性的限制吗?
答案 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