使用HitTest远程控制WPF
Using HitTest to remote control WPF
我正在开发一个移动应用程序来远程控制 WPF UI。
UI 由第三方管理,第三方可以随时 add\remove 按钮。
我正在将 UI 流式传输到客户端 Windows 商店应用程序,它正在将触摸坐标发送到服务器。
服务器然后使用 HitTest 获取 WPF UI 上的元素和 运行 操作。
它大部分时间都有效,但有时不会调用过滤器回调。
这是一个伪代码。
private void Button_Click_1(object sender, RoutedEventArgs e)
{
Point p = new Point(77, 45);
// Coordinates received on server comes here
VisualTreeHelper.HitTest(this,
new HitTestFilterCallback(FilterCallback),
new HitTestResultCallback(ResultCallback),
new PointHitTestParameters(p));
}
private HitTestFilterBehavior FilterCallback( DependencyObject target)
{
System.Diagnostics.Debug.WriteLine(target.GetType());
if (typeof(Button) == target.GetType())
{
Button b = (Button)target;
Button_Click(b, null);
return HitTestFilterBehavior.Stop;
}
else
{
return HitTestFilterBehavior.Continue;
}
}
private HitTestResultBehavior ResultCallback(HitTestResult result)
{
System.Diagnostics.Debug.WriteLine(result.VisualHit.GetType());
return HitTestResultBehavior.Stop;
}
您必须从 HitTestResultCallback return Continue
。否则命中测试将不会遍历完整的可视化树,并且可能会在到达 Button 控件之前停止。
private HitTestResultBehavior ResultCallback(HitTestResult result)
{
return HitTestResultBehavior.Continue;
}
有关详细信息,请参阅 MSDN 上的 Hit Testing in the Visual Layer 文章。
我正在开发一个移动应用程序来远程控制 WPF UI。 UI 由第三方管理,第三方可以随时 add\remove 按钮。 我正在将 UI 流式传输到客户端 Windows 商店应用程序,它正在将触摸坐标发送到服务器。 服务器然后使用 HitTest 获取 WPF UI 上的元素和 运行 操作。
它大部分时间都有效,但有时不会调用过滤器回调。 这是一个伪代码。
private void Button_Click_1(object sender, RoutedEventArgs e)
{
Point p = new Point(77, 45);
// Coordinates received on server comes here
VisualTreeHelper.HitTest(this,
new HitTestFilterCallback(FilterCallback),
new HitTestResultCallback(ResultCallback),
new PointHitTestParameters(p));
}
private HitTestFilterBehavior FilterCallback( DependencyObject target)
{
System.Diagnostics.Debug.WriteLine(target.GetType());
if (typeof(Button) == target.GetType())
{
Button b = (Button)target;
Button_Click(b, null);
return HitTestFilterBehavior.Stop;
}
else
{
return HitTestFilterBehavior.Continue;
}
}
private HitTestResultBehavior ResultCallback(HitTestResult result)
{
System.Diagnostics.Debug.WriteLine(result.VisualHit.GetType());
return HitTestResultBehavior.Stop;
}
您必须从 HitTestResultCallback return Continue
。否则命中测试将不会遍历完整的可视化树,并且可能会在到达 Button 控件之前停止。
private HitTestResultBehavior ResultCallback(HitTestResult result)
{
return HitTestResultBehavior.Continue;
}
有关详细信息,请参阅 MSDN 上的 Hit Testing in the Visual Layer 文章。