如何正确使用VisualTreeHelper#HitTest和TagVisualizer

发布于 2024-10-07 09:19:14 字数 1857 浏览 0 评论 0原文

在我的应用程序中,我想确保仅当标记的对象放置在椭圆上时才显示 TagVisualization。所以我使用这段代码来做到这一点:

 private void TagVisualizer_VisualizationAdded(object sender, TagVisualizerEventArgs e)
        {
            Console.WriteLine("Hitlist");

            //Notes
            if (e.TagVisualization.GetType() == typeof(NoteVisualization))
            {
                bool found = false;
                Point pt = e.TagVisualization.Center;
                hitResultsList.Clear();
                VisualTreeHelper.HitTest(RootLayer, null, new HitTestResultCallback(MyHitTestResult), new PointHitTestParameters(pt));

                if (hitResultsList.Count > 0)
                {
                    foreach (DependencyObject o in hitResultsList)
                    {
                        if (o.GetType() == typeof(Ellipse))
                        {

                            Console.WriteLine("Placed on a Sourcefile");

                            SourceFile sf = (((o as Ellipse).Tag) as SourceFile);
                            GroupBox gp = e.TagVisualization.FindName("GroupHeader") as GroupBox;
                            gp.Header = sf.getFullName();
                            e.TagVisualization.Tag = sf;

                            SurfaceButton save = e.TagVisualization.FindName("NoteSave") as SurfaceButton;
                            save.Tag = sf;

                            found = true;
                            break;
                        }



                    }
                }

                if (!found)
                {
                    e.TagVisualization.Visibility = System.Windows.Visibility.Collapsed;
                    Console.WriteLine("Placed somewhere else");
                }
            }
        }

我不太确定这是否是正确的方法,因为我没有避免显示 TagVisualization,而是立即将 Visibility 设置为折叠。我认为必须有更好的方法来做到这一点?

In my application I want to ensure that a TagVisualization is only displayed if the tagged object is placed on a Ellipse. So I used this code to do that:

 private void TagVisualizer_VisualizationAdded(object sender, TagVisualizerEventArgs e)
        {
            Console.WriteLine("Hitlist");

            //Notes
            if (e.TagVisualization.GetType() == typeof(NoteVisualization))
            {
                bool found = false;
                Point pt = e.TagVisualization.Center;
                hitResultsList.Clear();
                VisualTreeHelper.HitTest(RootLayer, null, new HitTestResultCallback(MyHitTestResult), new PointHitTestParameters(pt));

                if (hitResultsList.Count > 0)
                {
                    foreach (DependencyObject o in hitResultsList)
                    {
                        if (o.GetType() == typeof(Ellipse))
                        {

                            Console.WriteLine("Placed on a Sourcefile");

                            SourceFile sf = (((o as Ellipse).Tag) as SourceFile);
                            GroupBox gp = e.TagVisualization.FindName("GroupHeader") as GroupBox;
                            gp.Header = sf.getFullName();
                            e.TagVisualization.Tag = sf;

                            SurfaceButton save = e.TagVisualization.FindName("NoteSave") as SurfaceButton;
                            save.Tag = sf;

                            found = true;
                            break;
                        }



                    }
                }

                if (!found)
                {
                    e.TagVisualization.Visibility = System.Windows.Visibility.Collapsed;
                    Console.WriteLine("Placed somewhere else");
                }
            }
        }

I'm not really sure if this is the correct way, since I don't avoid that the TagVisualization is displayed, but instead I instantly set the Visibility to collpased. I think there have to be better ways to do that?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

她比我温柔 2024-10-14 09:19:14

SDK 示例之一显示了如何执行此操作的官方指南:
http://msdn.microsoft.com/en- us/library/ee804861(v=Surface.10).aspx

-robert(Surface 开发平台前程序经理)

official guidance for how to do this is shown in one of the sdk samples:
http://msdn.microsoft.com/en-us/library/ee804861(v=Surface.10).aspx

-robert (former program manager for the surface dev platform)

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文