【问题标题】:Accessing the root visual of a ContentPresenter hosting a DataTemplate访问托管 DataTemplate 的 ContentPresenter 的根视觉对象
【发布时间】:2009-08-18 02:34:22
【问题描述】:

我正在通过拖放操作使用 Adorner 模型,我正在通过 ContentPresenter 实例化一个 DataTemplate 并将其添加到我的控件/窗口的 Adorner 层。我遇到的问题是我需要在实例化的 DataTemplate 的根视觉元素上注册鼠标事件,以便我可以更改状态并检测我的行为下降。由于我正在编写一个行为,我需要在代码中访问它。我可以尝试将事件附加到演示者本身,但这无济于事,我假设我可以在 DataTemplate 中使用 TemplateBinding,但我真的不想把这个负担放在创建者身上数据模板。

<DataTemplate>
    <TextBlock Text={Binding Path=Name} />
</DataTemplate>

ContentPresenter presenter = new ContentPresenter();
presenter.Child = myDataTemplate;

adornerLayer.Items.Add(presenter);

【问题讨论】:

    标签: c# .net wpf data-binding


    【解决方案1】:

    您不能使用 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;
        }
    

    【讨论】:

      猜你喜欢
      • 2011-08-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-02
      • 1970-01-01
      • 1970-01-01
      • 2016-09-29
      相关资源
      最近更新 更多