我的问题是我有新闻列表框:
点击某个项目,它将打开带有完整文章的aticle页面。
所以,当我返回新闻页面时,我看到列表框就像我导航到文章之前那样,但我希望项目使用在顶部
1)更改索引不起作用,因为它们必须保持不变。
我试过了:
if (currentArticle < NewsListBox.SelectedIndex)
{
var scrollViwer = GetScrollViewer(NewsListBox) as ScrollViewer;
if (scrollViwer != null)
{
scrollViwer.ScrollToVerticalOffset(scrollViwer.VerticalOffset + (NewsListBox.SelectedIndex - currentArticle));
}
currentArticle = NewsListBox.SelectedIndex;
}
else if (currentArticle == NewsListBox.SelectedIndex)
{
}
else
{
var scrollViwer = GetScrollViewer(NewsListBox) as ScrollViewer;
if (scrollViwer != null)
{
scrollViwer.ScrollToVerticalOffset(scrollViwer.VerticalOffset - (currentArticle - NewsListBox.SelectedIndex));
}
currentArticle = NewsListBox.SelectedIndex;
}
public static DependencyObject GetScrollViewer(DependencyObject o)
{
// Return the DependencyObject if it is a ScrollViewer
if (o is ScrollViewer)
{ return o; }
for (int i = 0; i < VisualTreeHelper.GetChildrenCount(o); i++)
{
var child = VisualTreeHelper.GetChild(o, i);
var result = GetScrollViewer(child);
if (result == null)
{
continue;
}
else
{
return result;
}
}
return null;
}
它可以工作,但如果前一个元素没有正确地位于顶部,它就不会正确地将元素置于顶部 - 这在用户进行滚动时是不可能的。
此外:
NewsListBox.ScrollIntoView(NewsListBox.Items[5]);
工作正常,但它显示在底部的元素,我需要在顶部。
附加2:
这样可以正常工作:
NewsListBox.ScrollIntoView(NewsListBox.SelectedIndex+OFFSET);
我需要帮助来计算这个偏移量
答案 0 :(得分:1)
我找到了一个解决方案,可能并不完美,但它确实有效:scrollViwer.ScrollToVerticalOffset(0); scrollViwer.ScrollToVerticalOffset(NewsListBox.SelectedIndex);
答案 1 :(得分:0)
如何添加“DateTime”的“UsedDate”属性,指示最新的使用日期,并按UserDate对ListBox进行排序。
答案 2 :(得分:0)
我不确定您要对ScrollViewer
做什么,但是当我需要重新安排UI容器控件(例如ListBox
)中的项目顺序时,我只是重新排列绑定到控件的数据集合对象中的项目顺序,控件中的项目遵循该顺序。
您可以按照@terasato建议的日期(和时间)订购它们,或者使用Insert
方法将所选项目移动到集合中的第一个位置。
如果我错过了你的观点,请道歉。
再次阅读你的问题之后,我看到一条线说集合对象的索引必须保持不变。如果您认为无法对原始集合进行排序,则需要对从原始集合中复制的另一个集合进行排序。
我经常这样做是为了允许用户过滤对象集合,同时保持原始对象集合不变。你有两个选择;在代码隐藏/视图模型中创建与集合相同类型的另一个属性,并将原始集合复制到该集合中,或使用xaml CollectionViewSource
对象对UI中的对象进行排序。