none
wp8 ListBox控件 DoubleTap事件 RRS feed

  • 问题

  • <ListBox x:Name="List_Students"  DoubleTap="List_Students_DoubleTap">
           <ListBox.ItemTemplate>
                    <DataTemplate>
                             <grid>
                                     < Grid.RowDefinitions>
                                              <rowdefinitions/>
                                     < Grid.RowDefinitions/>
                                     <Grid.ColumnDefinitions>
                                             <ColumnDefinition/>
                                             <ColumnDefinition/>
                                   </Grid.ColumnDefinitions>   
    <TextBlock Text="{Binding ID}"  grid.row="0" grid.column="0"/>
                                   <TextBlock Text="{Binding Name}" grid.row="0" grid.column = "1" />                       
                            <grid>
                  </DataTemplate>
          </ListBox.ItemTemplate>
    </ListBox>
    代码实现的是在listbox绑定数据后,双击某一项,实现一些操作,现在问题是当双击的时候没有点在有数据显示的地方,会出现双击无响应的情况,比如说:有一项数据是“abc _______________________ ”里面的下划线代表是这一行的空白部分,也就是数据项的长度没有占满整行,当双击这些空白部分的时候会出现无响应或者崩溃的情况,不知道哪位大神可有解决办法?             
    2014年6月12日 7:20

全部回复

  • 你好,

    我创建了一个WP8项目来重现这个问题,在DoubleTap事件中没有放置任何事件处理的代码,这样可以帮助我们排除这个问题是否由于ListBox本身所引发。在多次双击条目后,没有出现未响应或者崩溃的情况。

    下面是我的一些想法,

    1. 可能这个问题是由DoubleTap 事件的实现代码所引发

    <1>.在处理代码中要加上非空判断;

    <2>.建议提供崩溃的异常信息和DoubleTap事件的实现代码,这样便于分析问题;

    2. 不建议使用DoubleTap来处理选择改变事件,建议使用SelectionChanged事件来处理。

    谢谢!


    We are trying to better understand customer views on social support experience, so your participation in this interview project would be greatly appreciated if you have time. Thanks for helping make community forums a great place.
    Click HERE to participate the survey.

    2014年6月13日 7:21
    版主
  • ......
    <ListBox Grid.Row="0" Grid.ColumnSpan="4" Name="lbIncomeCategory" SelectionChanged="lbIncomeCategory_SelectionChanged" Tap="lbIncomeCategory_Tap" ScrollViewer.VerticalScrollBarVisibility="Auto">
                            <ListBox.ItemTemplate>
                                <DataTemplate>
                                
                                    <Grid x:Name="griditem" Tag="{Binding InOutItemID}" DoubleTap="Grid_DoubleTap">
                                        <Grid.RowDefinitions>
                                            <RowDefinition Height="Auto"></RowDefinition>
                                        </Grid.RowDefinitions>
                                        <TextBlock Text="{Binding InOutItemName}" FontSize="30" Grid.Row="0" Foreground="{StaticResource PhoneTextBoxBrush}"></TextBlock>
                                    </Grid>
                                    
                            </DataTemplate>
                            </ListBox.ItemTemplate>
                        </ListBox>
    ......
            private void lbIncomeCategory_SelectionChanged(object sender, SelectionChangedEventArgs e)
            {
                (ApplicationBar.Buttons[1] as ApplicationBarIconButton).IsEnabled = true;
                (ApplicationBar.Buttons[2] as ApplicationBarIconButton).IsEnabled = true;
            }
    
            private void lbIncomeCategory_Tap(object sender, System.Windows.Input.GestureEventArgs e)
            {
                for (int i = 0; i < lbIncomeCategory.Items.Count; i++)
                {
                    ListBoxItem itemcontrol = this.lbIncomeCategory.ItemContainerGenerator.ContainerFromIndex(i) as ListBoxItem;
                    itemcontrol.Background = null;
                }
    
                try
                {
                    ListBoxItem item = this.lbIncomeCategory.ItemContainerGenerator.ContainerFromIndex(lbIncomeCategory.SelectedIndex) as ListBoxItem;
    
                    item.Background = App.Current.Resources["PhoneAccentBrush"] as SolidColorBrush;
                }
                catch { }
            }
    

    上面的xaml和cs是有关的一部分代码,考虑到ListBox的Tap事件我这边是用来改变每一项的背景色,如果再用Listox的DoubleTap事件实现某一项双击的功能,我觉得会出现双击无响应的问题,所以我这边就用嵌套的Grid 的DoubleTap事件实现某一项双击的效果,因此就出现了我一开始提出的问题。

    private void Grid_DoubleTap(object sender, System.Windows.Input.GestureEventArgs e) { string inoutItemID = ((Grid)sender).Tag.ToString(); InOutItemInfo item = (InOutItemInfo)lbIncomeCategory.SelectedValue; string selectedIetmVal = item.InOutItemName; NavigationService.Navigate(new Uri("/CategoryEdit.xaml?itemId=" + inoutItemID + "&itemName=" + selectedIetmVal + "&type=IN", UriKind.Relative)); }

    private void appbar_delete_Click(object sender, EventArgs e)
            {
                InOutItemInfo item = (InOutItemInfo)lbIncomeCategory.SelectedValue;
                categoryColl.inOutItemInfo.Remove(item);
                accountDB.Tb_InOutItemInfo.DeleteOnSubmit(item);
                accountDB.SubmitChanges();
            }

    另外

    1.在单击某一项改变颜色,我这里是每单击一次,将所有项遍历一次,然后将当前选中项的背景色改变,我觉得这样影响性能,不知道有没有更好的解决办法。

    2.当我选中整个列表的最后一项时,如果实现上面删除该项的这一项的时候,会出现异常,我这里是放在try..catch里面了,也会影响性能,请大神给我解答。


    2014年6月13日 8:52
  • private void Grid_DoubleTap(object sender, System.Windows.Input.GestureEventArgs e)
            {
                
                string inoutItemID = ((Grid)sender).Tag.ToString();
                InOutItemInfo item = (InOutItemInfo)lbIncomeCategory.SelectedValue;
                string selectedIetmVal = item.InOutItemName;
                NavigationService.Navigate(new Uri("/CategoryEdit.xaml?itemId=" + inoutItemID + "&itemName=" + selectedIetmVal + "&type=IN", UriKind.Relative));
            }
    
    


    ......
    <ListBox Grid.Row="0" Grid.ColumnSpan="4" Name="lbIncomeCategory" SelectionChanged="lbIncomeCategory_SelectionChanged" Tap="lbIncomeCategory_Tap" ScrollViewer.VerticalScrollBarVisibility="Auto">
                            <ListBox.ItemTemplate>
                                <DataTemplate>
                                
                                    <Grid x:Name="griditem" Tag="{Binding InOutItemID}" DoubleTap="Grid_DoubleTap">
                                        <Grid.RowDefinitions>
                                            <RowDefinition Height="Auto"></RowDefinition>
                                        </Grid.RowDefinitions>
                                        <TextBlock Text="{Binding InOutItemName}" FontSize="30" Grid.Row="0" Foreground="{StaticResource PhoneTextBoxBrush}"></TextBlock>
                                    </Grid>
                                    
                            </DataTemplate>
                            </ListBox.ItemTemplate>
                        </ListBox>
    ......
            private void lbIncomeCategory_SelectionChanged(object sender, SelectionChangedEventArgs e)
            {
                (ApplicationBar.Buttons[1] as ApplicationBarIconButton).IsEnabled = true;
                (ApplicationBar.Buttons[2] as ApplicationBarIconButton).IsEnabled = true;
            }
    
            private void lbIncomeCategory_Tap(object sender, System.Windows.Input.GestureEventArgs e)
            {
                for (int i = 0; i < lbIncomeCategory.Items.Count; i++)
                {
                    ListBoxItem itemcontrol = this.lbIncomeCategory.ItemContainerGenerator.ContainerFromIndex(i) as ListBoxItem;
                    itemcontrol.Background = null;
                }
    
                try
                {
                    ListBoxItem item = this.lbIncomeCategory.ItemContainerGenerator.ContainerFromIndex(lbIncomeCategory.SelectedIndex) as ListBoxItem;
    
                    item.Background = App.Current.Resources["PhoneAccentBrush"] as SolidColorBrush;
                }
                catch { }
            }
    private void appbar_delete_Click(object sender, EventArgs e)
            {
                InOutItemInfo item = (InOutItemInfo)lbIncomeCategory.SelectedValue;
                categoryColl.inOutItemInfo.Remove(item);
                accountDB.Tb_InOutItemInfo.DeleteOnSubmit(item);
                accountDB.SubmitChanges();
            }

    上面的xaml和cs是有关的一部分代码,考虑到ListBox的Tap事件我这边是用来改变每一项的背景色,如果再用Listox的DoubleTap事件实现某一项双击的功能,我觉得会出现双击无响应的问题,所以我这边就用嵌套的Grid 的DoubleTap事件实现某一项双击的效果,因此就出现了我一开始提出的问题。

    另外

    1.在单击某一项改变颜色,我这里是每单击一次,将所有项遍历一次,然后将当前选中项的背景色改变,我觉得这样影响性能,不知道有没有更好的解决办法。

    2.当我选中整个列表的最后一项时,如果实现上面删除该项的这一项的时候,会出现异常,我这里是放在try..catch里面了,也会影响性能,请大神给我解答。


    2014年6月15日 9:40