【发布时间】:2015-02-05 07:56:00
【问题描述】:
ScrollViewer 似乎有一个默认行为,当 ItemsControl 的 Items 丢失一个元素时,它会滚动到 ItemsControl。
举个例子:
<ScrollViewer>
<ItemsControl>
<TextBlock Text="Something"/>
<TextBlock Text="Something"/>
<TextBlock Text="Something"/>
<TextBlock Text="Something"/>
<TextBlock Text="Something"/>
<TextBlock Text="Something"/>
<TextBlock Text="Something"/>
<TextBlock Text="Something"/>
<TextBlock Text="Something"/>
<TextBlock Text="Something"/>
<ItemsControl>
<Button Click="ButtonBase_OnClick">
<TextBlock Text="Some item"/>
</Button>
<Button Click="ButtonBase_OnClick">
<TextBlock Text="Some item"/>
</Button>
<Button Click="ButtonBase_OnClick">
<TextBlock Text="Some item"/>
</Button>
<Button Click="ButtonBase_OnClick">
<TextBlock Text="Some item"/>
</Button>
<Button Click="ButtonBase_OnClick">
<TextBlock Text="Some item"/>
</Button>
<Button Click="ButtonBase_OnClick">
<TextBlock Text="Some item"/>
</Button>
<Button Click="ButtonBase_OnClick">
<TextBlock Text="Some item"/>
</Button>
<Button Click="ButtonBase_OnClick">
<TextBlock Text="Some item"/>
</Button>
<Button Click="ButtonBase_OnClick">
<TextBlock Text="Some item"/>
</Button>
<Button Click="ButtonBase_OnClick">
<TextBlock Text="Some item"/>
</Button>
<Button Click="ButtonBase_OnClick">
<TextBlock Text="Some item"/>
</Button>
<Button Click="ButtonBase_OnClick">
<TextBlock Text="Some item"/>
</Button>
<Button Click="ButtonBase_OnClick">
<TextBlock Text="Some item"/>
</Button>
<Button Click="ButtonBase_OnClick">
<TextBlock Text="Some item"/>
</Button>
<Button Click="ButtonBase_OnClick">
<TextBlock Text="Some item"/>
</Button>
<Button Click="ButtonBase_OnClick">
<TextBlock Text="Some item"/>
</Button>
<Button Click="ButtonBase_OnClick">
<TextBlock Text="Some item"/>
</Button>
<Button Click="ButtonBase_OnClick">
<TextBlock Text="Some item"/>
</Button>
<Button Click="ButtonBase_OnClick">
<TextBlock Text="Some item"/>
</Button>
<Button Click="ButtonBase_OnClick">
<TextBlock Text="Some item"/>
</Button>
<Button Click="ButtonBase_OnClick">
<TextBlock Text="Some item"/>
</Button>
<Button Click="ButtonBase_OnClick">
<TextBlock Text="Some item"/>
</Button>
<Button Click="ButtonBase_OnClick">
<TextBlock Text="Some item"/>
</Button>
<Button Click="ButtonBase_OnClick">
<TextBlock Text="Some item"/>
</Button>
<Button Click="ButtonBase_OnClick">
<TextBlock Text="Some item"/>
</Button>
<Button Click="ButtonBase_OnClick">
<TextBlock Text="Some item"/>
</Button>
<Button Click="ButtonBase_OnClick">
<TextBlock Text="Some item"/>
</Button>
<Button Click="ButtonBase_OnClick">
<TextBlock Text="Some item"/>
</Button>
<Button Click="ButtonBase_OnClick">
<TextBlock Text="Some item"/>
</Button>
<Button Click="ButtonBase_OnClick">
<TextBlock Text="Some item"/>
</Button>
<Button Click="ButtonBase_OnClick">
<TextBlock Text="Some item"/>
</Button>
<Button Click="ButtonBase_OnClick">
<TextBlock Text="Some item"/>
</Button>
<Button Click="ButtonBase_OnClick">
<TextBlock Text="Some item"/>
</Button>
<Button Click="ButtonBase_OnClick">
<TextBlock Text="Some item"/>
</Button>
<Button Click="ButtonBase_OnClick">
<TextBlock Text="Some item"/>
</Button>
<Button Click="ButtonBase_OnClick">
<TextBlock Text="Some item"/>
</Button>
<Button Click="ButtonBase_OnClick">
<TextBlock Text="Some item"/>
</Button>
<Button Click="ButtonBase_OnClick">
<TextBlock Text="Some item"/>
</Button>
</ItemsControl>
</ItemsControl>
</ScrollViewer>
ButtonBase_OnClick 定义如下:
private void ButtonBase_OnClick(object sender, RoutedEventArgs e) {
((sender as Button).Parent as ItemsControl).Items.Remove(sender);
}
在任何操作之前它看起来像这样:
但是,如果我点击一个按钮(它将自己从 ItemsControl 中删除):
如果我添加一个项目而不是删除一个项目,它就不会发生。如何防止这种行为?
编辑
如果我添加此代码,它不会发生:
Loaded += (sender, args) => {
new Thread(() => {
Thread.Sleep(1500);
Dispatcher.Invoke(new Action(() => {
MyItemsControl.Items.Remove(MyItemsControl.Items[1]);
}));
}).Start();
};
但是,如果我添加:
(MyItemsControl.Items[1] as FrameworkElement).Focus();
就在我删除它之前,该行为发生了。
所以这不是在任何项目被删除时,而是只有当项目具有焦点时。因此,解决此问题的一种方法是在删除之前从项目中删除焦点。
有没有更方便的方法来阻止它的发生?
编辑 n°2
我没有指定我使用的是框架 .Net v3.5。在@Joseph 发表评论后,我在 4.5.1 中进行了尝试,实际上这在 4.5.1 中没有发生。
【问题讨论】:
-
我试过你的代码,你提到的滚动没有发生!
-
@Joseph 编辑了我的问题:它似乎发生在框架 3.5 但不是 4.5.1
-
而你必须使用.net 3.5?
-
@Joseph 确实如此。我创建应用程序和组件以集成到管理高达 3.5 的 SCADA 软件中
-
这是一个非常烦人的行为,即使您手动 ScrollToTop(),如果不添加延迟也将无法正常工作!希望有人可以帮助...ps:标记 .Net3.5
标签: wpf .net-3.5 scrollviewer itemscontrol