我正在使用带有拖放功能的装饰器模型,我正在通过ContentPresenter实例化一个数据模板,并将其添加到控件/窗口的装饰器层中。我的问题是,我需要在实例化的datatemplate的根可视元素上注册鼠标事件,这样我就可以更改状态并检测我行为的下降。因为我在写一个行为,所以我需要在代码中访问它。我可以尝试将事件附加到演示者本身,但这不起任何作用,我假设我可以在DataTemplate中使用TemplateBinding,但我不想给创建DataTemplate的人带来负担。
<DataTemplate> <TextBlock Text={Binding Path=Name} /> </DataTemplate> ContentPresenter presenter = new ContentPresenter(); presenter.Child = myDataTemplate; adornerLayer.Items.Add(presenter);
你不能用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; }