WPF中确保显示TreeView选中的Item

WPF中没有提供确保显示TreeView选中的Item的功能,因此写个函数实现:

        public void EnsureTreeViewItemVisible(TreeView treeview, TreeViewItem selectedItem)
        {
            Point itemPosition = selectedItem.TranslatePoint(new Point(0, 0), treeview);

            ScrollViewer scrollViewer = (ScrollViewer)VisualTreeHelper.GetChild(VisualTreeHelper.GetChild(treeview, 0), 0);

            int childenCount = VisualTreeHelper.GetChildrenCount(selectedItem);

            double selectdItemWidth = treeview.ActualWidth;
            double selecedItemHeight = 16;

            if (childenCount > 0)
            {
                FrameworkElement itemGrid = (FrameworkElement)VisualTreeHelper.GetChild(selectedItem, 0);

                FrameworkElement itemExpander = (FrameworkElement)VisualTreeHelper.GetChild(itemGrid, 0);

                FrameworkElement itemBorder = (FrameworkElement)VisualTreeHelper.GetChild(itemGrid, 1);


                selectdItemWidth = itemExpander.ActualWidth + itemBorder.ActualWidth;
                selecedItemHeight = itemBorder.ActualHeight > itemExpander.ActualHeight ? itemBorder.ActualHeight : itemExpander.ActualHeight;
            }
            else
            {
                Trace.WriteLine("Can't get the item children!");
            }


            double horizontalOffset = scrollViewer.HorizontalOffset;
            if (itemPosition.X < 0)
            {
                horizontalOffset += itemPosition.X;
            }
            else if ((itemPosition.X + selectdItemWidth) > scrollViewer.ViewportWidth)
            {
                if (selectdItemWidth > treeview.ActualWidth)
                {
                    horizontalOffset -= itemPosition.X;
                }
                else
                {
                    horizontalOffset += (itemPosition.X + selectdItemWidth - scrollViewer.ViewportWidth);
                }
            }

            if (horizontalOffset != scrollViewer.HorizontalOffset)
                scrollViewer.ScrollToHorizontalOffset(horizontalOffset);

            double verticalOffset = scrollViewer.VerticalOffset;
            if (itemPosition.Y < 0)
            {
                verticalOffset += itemPosition.Y;
            }
            else if ((itemPosition.Y + selecedItemHeight) > scrollViewer.ViewportHeight)
            {
                verticalOffset += (itemPosition.Y + selecedItemHeight - scrollViewer.ViewportHeight);
            }

            if (verticalOffset != scrollViewer.VerticalOffset)
                scrollViewer.ScrollToVerticalOffset(verticalOffset);


        }

 

        private void TestTreeView_ItemSelected(object sender, RoutedEventArgs e)
        {
            Application.Current.Dispatcher.BeginInvoke(new Action(delegate
                {
                    TreeViewItem selectedItem = e.OriginalSource as TreeViewItem;

                    ViewModel.EnsureTreeViewItemVisible(VisualElementTree, selectedItem);

                }), System.Windows.Threading.DispatcherPriority.ApplicationIdle);
        }

 

        <TreeView x:Name="TestTreeView" TreeViewItem.Selected="TestTreeView_ItemSelected">
          </TreeView>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值