代码之家  ›  专栏  ›  技术社区  ›  dariusriggins

访问承载数据模板的ContentPresenter的根Visual

  •  0
  • dariusriggins  · 技术社区  · 17 年前

    我正在使用带有拖放功能的装饰器模型,我正在通过ContentPresenter实例化一个数据模板,并将其添加到控件/窗口的装饰器层中。我的问题是,我需要在实例化的datatemplate的根可视元素上注册鼠标事件,这样我就可以更改状态并检测我行为的下降。因为我在写一个行为,所以我需要在代码中访问它。我可以尝试将事件附加到演示者本身,但这不起任何作用,我假设我可以在DataTemplate中使用TemplateBinding,但我不想给创建DataTemplate的人带来负担。

    <DataTemplate>
        <TextBlock Text={Binding Path=Name} />
    </DataTemplate>
    
    ContentPresenter presenter = new ContentPresenter();
    presenter.Child = myDataTemplate;
    
    adornerLayer.Items.Add(presenter);
    
    1 回复  |  直到 17 年前
        1
  •  0
  •   Jeff Wilcox    17 年前

    你不能用VisualTreeHelper在 AdornedElement 或者尝试强制转换框架元素以在逻辑树中工作?

    添加到自定义修饰器中的此方法将从修饰元素的树(可能是窗口)中检索根可视对象。

        public UIElement GetRootVisual()
        {
            UIElement root = AdornedElement;
            if (root != null)
            {
                UIElement parent = VisualTreeHelper.GetParent(root) as UIElement;
                if (parent != null)
                {
                    root = parent;
                }
            }
    
            return root;
        }
    
    推荐文章