在Silverlight中选择项目时,无法阻止基类中TreeView上的自动水平滚动

Ari*_*oth 2 silverlight silverlight-toolkit silverlight-4.0

我想在Silverlight中选择树视图项时阻止自动水平滚动.我正在尝试在基类中完成它.

到目前为止,我还没有能够管理它.我已经尝试了下面的代码,但是它会执行,然后当我选择它时,事情就会滚动.

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

namespace MyControls
{
    public class CustomTreeView : TreeView
    {
        private ScrollViewer _scrollViewer;

        protected override void OnSelectedItemChanged(RoutedPropertyChangedEventArgs<object> e)
        {
            base.OnSelectedItemChanged(e);
            _scrollViewer.ScrollToHorizontalOffset(0);
        }

        public override void OnApplyTemplate()
        {
            base.OnApplyTemplate();
            _scrollViewer = GetTemplateChild("ScrollViewer") as ScrollViewer;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我实际上并不想完全禁用滚动 - 如果项目飞离树视图的边缘,我希望用户能够滚动到它.我想要做的是当我选择一个可能长于屏幕宽度的子节点时,将树保持在原来的位置.

我在WrapPanel上尝试了RequestBringIntoView,但这似乎只是WPF.我也试过在UpdateLayout和SelectedItemChanged上做这个.一切都无济于事.我似乎无法找到一个通用的解决方案,我可以让另一个类继承并使用.

有人有主意吗?

谢谢!

-Ari

编辑:赏金说明我需要能够在XAML中完成它.那是我的错字.我也将采用代码解决方案.谢谢!

Jus*_* XL 5

导致ScrollViewer滚动的原因是因为每次TreeView更改选择时,ScrollIntoView都会调用a(在TreeView源代码内),

this.ItemsControlHelper.ScrollIntoView(container.HeaderElement ?? container);
Run Code Online (Sandbox Code Playgroud)

它基本上试图滚动标题或整个TreeViewItem向左滚动.我首先想到你可以通过删除所有左边来修改两个TreeViewTreeViewItem样式Margin,并使标题与扩展器按钮的左边距相同.但是,此解决方案仅适用于第二级中的第一级项目,在项目之前有缩进,因此如果单击它,它将再次滚动.

所以我猜没有纯xaml解决方案.解决这个问题的简单方法是,鉴于你已经有了自定义控件,而不是调用(我认为存在时间问题,这就是为什么这段代码无效)

_scrollViewer.ScrollToHorizontalOffset(0); 
Run Code Online (Sandbox Code Playgroud)

你做

var scrollableRegions = _scrollViewer.GetVisualDescendants().OfType<IScrollInfo>();
            foreach (var region in scrollableRegions)
            {
                region.SetHorizontalOffset(0);
            }
Run Code Online (Sandbox Code Playgroud)

如果您真的更喜欢xaml解决方案,您可以将此代码放入行为或附加属性中,然后将其放入使用Blend中.

说了这些之后,我个人认为另一种解决方案更好,并且在我自己的应用程序中使用它是,完全禁用水平滚动条,并使用TextTrimming="WordEllipsis"我所有的TextBlocks内部TreeViewItems来指示用户有更多的文本.还提供GridSplitter允许用户调整TreeView内容的大小以查看全文而不是水平来回滚动.但这只是我的意见.

希望这可以帮助!:)