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中完成它.那是我的错字.我也将采用代码解决方案.谢谢!
导致ScrollViewer滚动的原因是因为每次TreeView更改选择时,ScrollIntoView都会调用a(在TreeView源代码内),
this.ItemsControlHelper.ScrollIntoView(container.HeaderElement ?? container);
Run Code Online (Sandbox Code Playgroud)
它基本上试图滚动标题或整个TreeViewItem向左滚动.我首先想到你可以通过删除所有左边来修改两个TreeView和TreeViewItem样式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内容的大小以查看全文而不是水平来回滚动.但这只是我的意见.
希望这可以帮助!:)
| 归档时间: |
|
| 查看次数: |
2157 次 |
| 最近记录: |