【问题标题】:How to get the logical tree item that contains data-templated object如何获取包含数据模板对象的逻辑树项
【发布时间】:2013-01-23 08:30:46
【问题描述】:

我有一个名为“TextModel”的对象。我为它定义了一个 HierarchicalDataTemplate。

像这样:

<HierarchicalDataTemplate DataType="{x:Type local:TextModel}"
                          ItemsSource="{Binding Children}">
  <TextBlock x:Name="TextPresenter"
             Text="{Binding Text}"
             Style="{StaticResource TextModelStyleMouseOver}" />
</HierarchicalDataTemplate>

这个 TextModel 包含在我的 TreeView 中的每个 TreeViewItem 中。 而且,在代码隐藏中,我使用 VisualTreeHelper.HitTest 来获取我单击的 TreeViewItem,但它没有将 TreeViewItem 作为 HitTest 结果之一提供给我。 HitTest 结果是:TextBlock(以及 Border、Grid 和 ScrollViewer)——我定义的 HierarchicalDataTemplate 中的那个。

我尝试使用 LogicalTreeHelper.GetParent(textBlockFromTheHitTestResults) 但它返回了一个空值。

感谢您的关注!

【问题讨论】:

    标签: wpf silverlight xaml datatemplate hierarchicaldatatemplate


    【解决方案1】:

    HitTest 有一个 overload 可用于过滤结果:

    VisualTreeHelper.HitTest(
        root,
        o => o is TreeViewItem ? HitTestFilterBehavior.ContinueSkipChildren : HitTestFilterBehavior.Continue,
        r =>
            {
                if (r.VisualHit is TreeViewItem)
                {
                    DoSomethingWithTreeViewItem((TreeViewItem)r.VisualHit);
                    return HitTestResultBehavior.Stop;
                }
    
                return HitTestResultBehavior.Continue;
            },
        new PointHitTestParameters(point));
    

    【讨论】:

    • 返回的r.VisualHit-s就像我之前提到的:TextBlock,以及Border、Grid和ScrollViewer。但是有一些有趣的东西 - o 实际上找到了 TreeViewItem,但随后用 r 调用的 HitTestResultCallback 是 Grid(上面写的命中测试结果之一)。所以我所做的是将找到的 o 作为 TreeViewItem 并将其保存在局部变量中,这将是您给我的这段代码的包装方法的返回值。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-08-31
    • 1970-01-01
    • 2023-02-07
    • 2021-01-12
    • 1970-01-01
    • 2015-06-09
    • 2020-04-08
    相关资源
    最近更新 更多