设备上未触发Windows Phone 8.1 ListView项模板网格保持事件

设备上未触发Windows Phone 8.1 ListView项模板网格保持事件,listview,grid,windows-phone-8.1,datatemplate,Listview,Grid,Windows Phone 8.1,Datatemplate,我有一个绑定的ListView,它使用网格作为ItemTemplate。网格有一个由保持事件触发的菜单输出。在emulator中,一切正常,但在设备上运行(带有Windows 8.1更新的Lumia 635),网格保持事件不会触发 如果我向ListView添加一个保持事件,这个事件将触发,但是我没有对被保持的项目的引用 要复制,1)将其添加到默认页面的主页标签中 <Page.Resources> <Style TargetType="TextBlock" x:Key=

我有一个绑定的ListView,它使用网格作为ItemTemplate。网格有一个由保持事件触发的菜单输出。在emulator中,一切正常,但在设备上运行(带有Windows 8.1更新的Lumia 635),网格保持事件不会触发

如果我向ListView添加一个保持事件,这个事件将触发,但是我没有对被保持的项目的引用

要复制,1)将其添加到默认页面的主页标签中

<Page.Resources>
    <Style TargetType="TextBlock"  x:Key="GridText">
        <Setter Property="FontSize" Value="20" />
        <Setter Property="FontWeight" Value="Normal" />
        <Setter Property="HorizontalAlignment" Value="Center" />
    </Style>
</Page.Resources>
<Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="*" />
        <RowDefinition Height="*" />
    </Grid.RowDefinitions>
    <ScrollViewer HorizontalAlignment="Stretch" Grid.Row="0" Margin="10" x:Name="scrollRecord" Background="DarkMagenta">
        <TextBlock x:Name="textRecord" FontSize="18" />
    </ScrollViewer>
    <ScrollViewer HorizontalAlignment="Stretch" Grid.Row="1" Margin="10">
        <ListView x:Name="listView" HorizontalAlignment="Stretch">
            <ListView.ItemTemplate>
                <DataTemplate>
                    <Grid HorizontalAlignment="Stretch"  Holding="Grid_Holding">
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition Width="*"/>
                        </Grid.ColumnDefinitions>
                        <FlyoutBase.AttachedFlyout>
                            <MenuFlyout>
                                <MenuFlyoutItem x:Name="buttonTick"
                                                        Text="Add"
                                                        Click="buttonAdd_Click"/>
                                <MenuFlyoutItem x:Name="buttonUntick"
                                                        Text="Remove"
                                                        Click="buttonRemove_Click"/>
                            </MenuFlyout>
                        </FlyoutBase.AttachedFlyout>

                        <TextBlock Style="{StaticResource GridText}"  Grid.Column="0" Text="{Binding Colour}" />
                    </Grid>
                </DataTemplate>
            </ListView.ItemTemplate>

        </ListView>
    </ScrollViewer>
</Grid>
}

类RouteList:ObservableCollection//ElementCollection {

}

  • 在MainPage.xaml.cs中,选择类定义下面的所有内容,并将其放在大括号中,然后将其粘贴到中

    公共主页() { this.InitializeComponent(); this.NavigationCacheMode=NavigationCacheMode.Required; this.Loaded+=主页面_Loaded; }

    routelistroutes;
    已加载无效主页(对象发送器、路由目标)
    {
    路由=新路由列表();
    路线。添加(新路线(“红色”));
    路线。添加(新路线(“橙色”);
    路线。添加(新路线(“粉色”);
    路线。添加(新路线(“蓝色”));
    路线。添加(新路线(“紫色”);
    listView.ItemsSource=路由;
    //DataTemplate t=listView.ItemTemplate;
    //AddText(“网格布局保持)
    }
    /// 
    ///当此页面即将显示在框架中时调用。
    /// 
    ///描述如何到达此页面的事件数据。
    ///此参数通常用于配置页面。
    受保护的覆盖无效OnNavigatedTo(NavigationEventArgs e)
    {
    //TODO:准备在此处显示的页面。
    //TODO:如果应用程序包含多个页面,请确保
    //通过注册来处理硬件后退按钮
    //Windows.Phone.UI.Input.HardwareButtons.BackPressed事件。
    //如果您正在使用某些模板提供的NavigationHelper,
    //此事件已为您处理。
    }
    私有无效网格保持(对象发送方,保持路由目标)
    {
    尝试
    {
    AddText(“Grid_Holding fired”+e.HoldingState.ToString());
    //显示弹出按钮(发送者);
    }
    捕获(例外情况除外)
    {
    添加文本(例如消息);
    }
    }
    专用void ShowFlyout(对象发送者)
    {
    FrameworkElement senderElement=发送方作为FrameworkElement;
    FlyoutBase FlyoutBase=FlyoutBase.GetAttachedFlyout(senderElement);
    飞出基地。ShowAt(senderElement);
    }
    私有void AddText(字符串s)
    {
    Text记录。Text+=s+“\n”;
    //scrollRecord.ScrollToVerticalOffset(scrollRecord.ScrollableHeight);
    scrollRecord.ChangeView(0,scrollRecord.ScrollableHeight,1.0f,false);
    }
    私有无效按钮单击(对象发送者,路由目标)
    {
    尝试
    {
    添加文本(“添加…”);
    MenuFlyoutItem=发送方作为MenuFlyoutItem;
    Route Route=m.DataContext作为路由;
    if(路由!=null)
    {
    字符串颜色=路由。颜色+“+”;
    路线。添加(新路线(颜色));
    }
    }
    捕获(例外情况除外)
    {
    添加文本(例如消息);
    }
    添加文本(“完成”);
    }
    私有无效按钮删除\单击(对象发送者,路由目标)
    {
    MenuFlyoutItem=发送方作为MenuFlyoutItem;
    Route Route=m.DataContext作为路由;
    if(路由!=null)
    {
    路线。移除(路线);
    }
    }
    私有无效列表视图(对象发送方、HoldingRoutedEventArgs e)
    {
    尝试
    {
    AddText(“listView_Holding fired”+e.HoldingState.ToString());
    //显示弹出按钮(发送者);
    }
    捕获(例外情况除外)
    {
    添加文本(例如消息);
    }
    }
    

  • 经过所有这些努力,我重新启动了手机,现在它工作正常。它工作了一段时间。在我的手机上捕获保持事件似乎是间歇性的,而模拟器每次都工作。捕获listview的保持事件工作得很好,所以我可以使用它,但网格的保持事件会更有用,我昏昏欲睡!事实证明,在使用emulator时,我总是在网格中单击文本。当我使用手指时,我通常不直接在文本上方,因此网格保持不会被触发。下面的xaml显示了这一点。一个修复方法是添加一个background=“Red”“到网格。透明背景不会捕获事件。我想我记得这是以前的事——也许是silverlight的画布。
    public Route()
    {
    }
    
    public Route(string colour)
    {
        Colour = colour;
    }
    
    [DataMember]
    public string Colour { get; set; }
    
    protected void OnPropertyChanged(PropertyChangedEventArgs e)
    {
        PropertyChangedEventHandler handler = PropertyChanged;
        if (handler != null)
            handler(this, e);
    }
    
    protected void OnPropertyChanged(string propertyName)
    {
        OnPropertyChanged(new PropertyChangedEventArgs(propertyName));
    }
    
    RouteList routes;
    
    void MainPage_Loaded(object sender, RoutedEventArgs e)
    {
        routes = new RouteList();
        routes.Add(new Route("Red"));
        routes.Add(new Route("Orange"));
        routes.Add(new Route("Pink"));
        routes.Add(new Route("Blue"));
        routes.Add(new Route("Violet"));
    
        listView.ItemsSource = routes;
    
        //DataTemplate t = listView.ItemTemplate;
        //AddText("gridLayout holding)
    }
    
    /// <summary>
    /// Invoked when this page is about to be displayed in a Frame.
    /// </summary>
    /// <param name="e">Event data that describes how this page was reached.
    /// This parameter is typically used to configure the page.</param>
    protected override void OnNavigatedTo(NavigationEventArgs e)
    {
        // TODO: Prepare page for display here.
    
        // TODO: If your application contains multiple pages, ensure that you are
        // handling the hardware Back button by registering for the
        // Windows.Phone.UI.Input.HardwareButtons.BackPressed event.
        // If you are using the NavigationHelper provided by some templates,
        // this event is handled for you.
    }
    
    
    
    private void Grid_Holding(object sender, HoldingRoutedEventArgs e)
    {
        try
        {
            AddText("Grid_Holding fired " + e.HoldingState.ToString());
            //ShowFlyout(sender);
        }
        catch (Exception ex)
        {
            AddText(ex.Message);
        }
    }
    
    private void ShowFlyout(object sender)
    {
        FrameworkElement senderElement = sender as FrameworkElement;
        FlyoutBase flyoutBase = FlyoutBase.GetAttachedFlyout(senderElement);
        flyoutBase.ShowAt(senderElement);
    }
    
    private void AddText(string s)
    {
        textRecord.Text += s + "\n";
        //scrollRecord.ScrollToVerticalOffset(scrollRecord.ScrollableHeight);
        scrollRecord.ChangeView(0, scrollRecord.ScrollableHeight,1.0f,false);
    }
    
    private void buttonAdd_Click(object sender, RoutedEventArgs e)
    {
        try
        {
            AddText("Adding...");
            MenuFlyoutItem m = sender as MenuFlyoutItem;
            Route route = m.DataContext as Route;
            if (route != null)
            {
                string colour = route.Colour + "+";
                routes.Add(new Route(colour));
            }
        }
        catch (Exception ex)
        {
            AddText(ex.Message);
    
        }
        AddText("Finished");
    }
    
    private void buttonRemove_Click(object sender, RoutedEventArgs e)
    {
        MenuFlyoutItem m = sender as MenuFlyoutItem;
        Route route = m.DataContext as Route;
        if (route != null)
        {
            routes.Remove(route);
        }
    }
    
    private void listView_Holding(object sender, HoldingRoutedEventArgs e)
    {
        try
        {
    
            AddText("listView_Holding fired " + e.HoldingState.ToString());
            //ShowFlyout(sender);
        }
        catch (Exception ex)
        {
            AddText(ex.Message);
        }
    }