Silverlight 行为中的 AssociatedObject.FindName OnAttached 方法返回 null

发布于 2024-08-19 04:22:28 字数 317 浏览 5 评论 0原文

我正在制作 Silverlight 行为,以允许通过包含的“拖动手柄”元素(而不是整个可拖动的元素)拖动元素。把它想象成一个窗口标题栏。

在我调用的 OnAttached 方法中: AssociatedObject.FindName(DragHandle) 但这返回 null。

然后我尝试处理 AssociatedObject 的 Loaded 事件并在那里运行我的代码,但我仍然返回 null。

我是否误解了 FindName 的功能? AssociatedObject 位于 ItemsControl 中(我想要一个可拖动元素的集合)。那么是否存在某种名称范围问题?

I'm making a Silverlight behavior to enable dragging an element by a contained "drag handle" element (rather than the whole element being draggable). Think of it like a window title bar.

In the OnAttached method I am calling: AssociatedObject.FindName(DragHandle)
but this is returning null.

I then tried handling the AssociatedObject's Loaded event and running my code there, but I still get a null returned.

Am I misunderstanding what FindName is able to do? The AssociatedObject is in an ItemsControl (I want a collection of draggable elements). So is there some kind of namescope problem?

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

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

发布评论

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

评论(1

青萝楚歌 2024-08-26 04:22:28

是的,这听起来像是名称范围问题。 有关 XAML 名称范围的 MSDN 文档介绍了如何名称空间是为模板和项目控件定义的。您是否为 ItemsControl 中的项目使用模板?

您可能只需要使用类似这样的方法递归地遍历可视化树即可按名称找到正确的元素:

    private static FrameworkElement FindChildByName(FrameworkElement parent, string name)
    {
        for (int i = 0; i < VisualTreeHelper.GetChildrenCount(parent); i++)
        {
            FrameworkElement child = VisualTreeHelper.GetChild(parent, i) as FrameworkElement;

            if (child != null && child.Name == name)
            {
                return child;
            }
            else
            {
                FrameworkElement grandChild = FindChildByName(child, name);

                if (grandChild != null)
                {
                    return grandChild;
                }
            }
        }

        return null;
    }

Yes, it sounds like a namescope problem. The MSDN documentation on XAML namescopes goes over how namesopes are defined for templates and item controls. Are you using a template for the items in your ItemsControl?

You may just have to walk the visual tree recursively with something like this to find the correct element by name:

    private static FrameworkElement FindChildByName(FrameworkElement parent, string name)
    {
        for (int i = 0; i < VisualTreeHelper.GetChildrenCount(parent); i++)
        {
            FrameworkElement child = VisualTreeHelper.GetChild(parent, i) as FrameworkElement;

            if (child != null && child.Name == name)
            {
                return child;
            }
            else
            {
                FrameworkElement grandChild = FindChildByName(child, name);

                if (grandChild != null)
                {
                    return grandChild;
                }
            }
        }

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