7

这应该是一个微不足道的任务,但我找不到如何去做。我想听听点击列表视图中的项目,获取相应的模型对象,然后启动一个新屏幕。

这是 ListView 的 XAML:

<ListView x:Name="ItemListView" 
    ItemTemplate="{StaticResource StoreFrontTileTemplate}"
    ItemContainerStyle="{StaticResource StoreFrontLVTileStyle}"
    Margin="0" VerticalAlignment="Top" ItemClick="MyClick" Tapped="MyTap"/>

和 MyClick、MyTap:

private void MyClick(object sender, ItemClickEventArgs e)
{
    Debug.WriteLine("Click!");
}

private void MyTap(object sender, TappedRoutedEventArgs e)
{
    Debug.WriteLine("TAp!!" + sender.ToString() + "--" + e.ToString());
}

导航到新屏幕的方法:

this.Frame.Navigate(typeof(SecondScreen));

它可以工作,但我需要单击项目的模型对象并将其作为参数传递给第二个屏幕。

但是 MyClick 从未被调用,并且 MyTap 没有给我任何关于被点击项目的信息。“发件人”是 ListView。

我下载了这些例子:

http://code.msdn.microsoft.com/windowsapps/XAML-ListView-sample-pack-0ec6b60f

但它不包含我需要的东西,有一个主/详细视图,但它适用于绑定,我想要做的是启动一个全新的屏幕。

注意:我是 Windows 开发中的菜鸟,并且倾向于在 Android 或 IOS 中执行此操作的常用方法,您可以在其中使用单击元素的位置实现回调。不知道在 Windows 8 中执行此操作的正确方法。

4

5 回答 5

29

您可以使用该SelectionChanged事件:

<ListView x:Name="ItemListView" SelectionChanged="MySelectionChanged" />

您可以从例如获取选定/删除的项目SelectionChangedEventArgs

private void MySelectionChanged(object sender, SelectionChangedEventArgs e)
{
    Debug.WriteLine("Selected: {0}", e.AddedItems[0]);
}

或者,如果您不需要选择功能和使用什么,ItemClick="MyClick" 您需要设置IsItemClickEnabledtrue

获取或设置一个值,该值指示视图中的项目是否引发 ItemClick 事件以响应交互。

<ListView x:Name="ItemListView" 
    ItemTemplate="{StaticResource StoreFrontTileTemplate}"
    ItemContainerStyle="{StaticResource StoreFrontLVTileStyle}"
    Margin="0" VerticalAlignment="Top" ItemClick="MyClick"  
    IsItemClickEnabled="bool" SelectionMode="None"/>

请注意,在这种情况下,您还需要将 设置SelectionModeNone

于 2012-11-10T22:35:46.570 回答
1

您可以在 XAML 代码上使用listview 的DoubleTapped事件。然后,在 C# 代码中,您可以通过以下方式获得位置:

private void display_DoubleTapped_1(object sender,
     Windows.UI.Xaml.Input.DoubleTappedRoutedEventArgs e)
{
     int items = display.SelectedIndex;
     // use this index to do something 
}
于 2013-05-06T08:40:28.830 回答
1

我用这个:

private void ListUI_Tapped(object sender, TappedRoutedEventArgs e)
    {
        if(ListUI.SelectedItems.Count != 0)
        {
            Debug.WriteLine("It's not a trap at all my friend");
        }
        else
        {
            Debug.WriteLine("Its a trap");
        }
    }
于 2016-03-07T01:23:16.357 回答
0
       // We have a class name 'Message' in ControllerLibrary Namespace

         namespace ControllerLibrary
            {
              public class Message
                {
                   public string MessageID { get; set; }
                    public string MessageName { get; set; }
                 }
            }

    // Add name space at page heading
               xmlns:local1="using:ControllerLibrary"

      //At Gridview 

        <GridView IsItemClickEnabled="True" Name="UserMessageList">
         <GridView.ItemTemplate>
           <DataTemplate x:DataType="local1:Message">                                          <StackPanel Orientation="Horizontal">
         <Button Content="{x:Bind MessageName}" HorizontalAlignment="Left" Margin="2 0 10 0" Click="btnUserMessage_Click">
        </Button>
        </StackPanel>
        </DataTemplate>
         </GridView.ItemTemplate>
        </GridView>

  //At code Behind
    private void btnAddPage_Click(object sender, RoutedEventArgs e)
      {
          //Get selecte message
          var selectedMessage = (sender as Button).DataContext as Message;
      }
于 2016-12-27T06:30:10.090 回答
0

我建议在与 XAML 关联的代码隐藏 C# 文件中,使用作为参数传递给ItemClick事件处理程序的ItemClickEventArgs对象的ClickedItem属性。

示例(对于 GridView,但对于 ListView 的想法相同)

private void GridView_ItemClick(object sender, ItemClickEventArgs e)
        {
            // This is how you determine the clicked item in a GridView,
            // and obtain the relevant element of the underlying collection
            // (to which the GridView is bound).
            // 'Tile' is here the 'type' used in the said collection.
            Tile output = e.ClickedItem as Tile;

            // ... 

        }
于 2018-09-18T19:54:38.117 回答