0

我的问题是我有 NewsList 框:

在此处输入图像描述

点击某个项目,它将打开带有完整文章的文章页面。

因此,当我返回新闻页面时,我会看到导航到文章之前的列表框,但我希望使用的项目出现在顶部

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);

我需要帮助来计算这个偏移量

4

3 回答 3

1

我找到了一个解决方案,可能并不完美,但它有效:scrollViwer.ScrollToVerticalOffset(0); scrollViwer.ScrollToVerticalOffset(NewsListBox.SelectedIndex);

于 2013-07-22T11:28:38.083 回答
0

如何添加指示最近使用日期的“DateTime”的“UsedDate”属性,并按UserDate对ListBox进行排序。

于 2013-07-22T08:27:53.720 回答
0

我不确定您要对 执行什么操作ScrollViewer,但是当我需要重新排列 UI 容器控件(例如 a ListBox)中的项目顺序时,我只需重新排列数据中项目的顺序绑定到控件的集合对象和控件中的项目遵循该顺序。

您可以按照@terasato 的建议按日期(和时间)对它们进行排序,或者使用一种Insert方法将所选项目移动到集合中的第一个位置。

抱歉,如果我错过了您的观点。

再次阅读您的问题后,我看到一行说集合对象的索引必须保持不变。如果您的意思是您无法对原始集合进行排序,那么您将需要对从原始集合复制的另一个集合进行排序。

我经常这样做是为了允许用户过滤对象集合,同时保持原始对象集合不变。你有两个选择;在代码后面/视图模型中创建与您的集合相同类型的另一个属性并将原始集合复制到其中,或者使用 xamlCollectionViewSource对象对 UI 中的对象进行排序。

于 2013-07-22T08:45:22.597 回答