Winrt ListView通过代码滚动到任何项目?

时间:2016-02-05 10:36:25

标签: c# xaml listview windows-runtime windows-store-apps

我正在尝试滚动到ListView中的特定项目 ListView包含500个项目("问题")。我想将其导航到特定的问题编号。

xaml中的ListView

<ListView x:Name="LstQuestions" SelectionMode="None" Grid.Row="1" d:IsLocked="True">
    <ListView.ItemsPanel>
         <ItemsPanelTemplate>
             <WrapGrid Orientation="Horizontal"/>
         </ItemsPanelTemplate>
    </ListView.ItemsPanel>
</ListView>

ListView项目是从代码加载的。

InitializeComponent();
for(int i=1;i<= 500; i++)
{
     Button btn = new Button();
     btn.Width = 120;
     btn.Height = 120;
     btn.Click += Btn_Click;
     btn.Content = i;
     LstQuestions.Items.Add(btn);
}
LstQuestions.UpdateLayout();

LstQuestions.ScrollIntoView((Button)LstQuestions.Items[_CurrentQuestionNumber]);

我正在尝试的是我有一个存储当前问题编号的设置,我希望它能自动将其滚动到ListView中的问题编号。

我尝试了ListView.ScrollIntoView和ListView.MakeVisible方法。没有任何效果。

我还发现了一件事。上面的代码在MainPage中工作正常。但是,如果我导航 Frame.Navigate(typeof(Questions)) 那么上面的代码将无法在问题页面中使用。

我怎样才能实现它?

1 个答案:

答案 0 :(得分:0)

我不知道问题是什么。但是我发现如果你从一个事件中调用ScrollIntoView它会起作用。

所以我创建了Layout_Updated事件。从该事件中调用ScrollIntoView。

<ListView x:Name="LstQuestions" SelectionMode="None" Grid.Row="1" LayoutUpdated="LstQuestions_LayoutUpdated" d:IsLocked="True">
    <ListView.ItemsPanel>
         <ItemsPanelTemplate>
             <WrapGrid Orientation="Horizontal"/>
         </ItemsPanelTemplate>
    </ListView.ItemsPanel>
</ListView>

public Questions()
{  
    InitializeComponent();
    for(int i=1;i<= 500; i++)
    {
         Button btn = new Button();
         btn.Width = 120;
         btn.Height = 120;
         btn.Click += Btn_Click;
         btn.Content = i;
         LstQuestions.Items.Add(btn);
    }
    LstQuestions.UpdateLayout();
}
private void LstQuestions_LayoutUpdated(object sender, object e)
{
   LstQuestions.ScrollIntoView(LstQuestions.Items[_CurrentQuestionNumber]);
}

现在可行。