当前位置:  开发笔记 > 编程语言 > 正文

WPF ControlTemplate用于滚动TreeView控件

如何解决《WPFControlTemplate用于滚动TreeView控件》经验,为你挑选了2个好方法。

我正在使用TreeView控件,当单击其中一个时,它会自动滚动到左对齐TreeViewItem.我已经去看了我的Styles和ControlTemplates,但我还没有找到任何东西.是否有一个默认的ControlTemplate导致这个?我想禁用它.



1> 小智..:

这些项目会滚动,因为ScrollViewer会对它们调用BringIntoView().因此,避免滚动的一种方法是禁止处理RequestBringIntoView事件.您可以通过继承TreeView并实例化此控件来快速尝试:

public class NoScrollTreeView : TreeView
{
    public class NoScrollTreeViewItem : TreeViewItem
    {
        public NoScrollTreeViewItem() : base()
        {
            this.RequestBringIntoView += delegate (object sender, RequestBringIntoViewEventArgs e) {
                e.Handled = true;
            };
        }

        protected override DependencyObject GetContainerForItemOverride()
        {
            return new NoScrollTreeViewItem();
        }
    }
    protected override DependencyObject GetContainerForItemOverride()
    {
        return new NoScrollTreeViewItem();
    }
}



2> 小智..:

在花了几个小时来解决这个问题后,我找到了一个适合我的解决方案.

brians解决方案是防止TreeViewItem上的RequestBringIntoView事件冒泡的第一步.不幸的是,如果以编程方式更改所选项目,这也会阻止显示树视图

yourtreeview.SelectedItem = yourtreeviewitem

所以,对我来说,解决方案是修改treeview的controltemplate,如下所示:


"autoscrollpreventer"是:

using System;
using System.Windows;
using System.Windows.Controls;

namespace LiveContext.Designer.GUI.Components {
    public class AutoScrollPreventer : StackPanel
    {
    public AutoScrollPreventer() {

        this.RequestBringIntoView += delegate(object sender, RequestBringIntoViewEventArgs e)
        {
            // stop this event from bubbling so that a scrollviewer doesn't try to BringIntoView..
            e.Handled = true;
        };

    }
}

}

希望能帮助到你..

推荐阅读
和谐啄木鸟
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有