列表框项目选择与发送者,如网格

时间:2013-09-12 08:04:09

标签: c# wpf xaml windows-8 listbox

嗨,我的列表框有问题。当我单击列表框中的项目(文本或图像)时,一切正常,但是当我单击项目行中的空白区域时,项目未被选中但我不知道哪里可能有问题,因为每个行/项目都像网格一样使用图像和文字,我已将标记设置为网格中的绑定,但如果单击文本或图像,则会选择项目。

 private void userTapped(object sender, TappedRoutedEventArgs e)
    {
        var button = sender as Grid;
        if (button != null)
        {
            var subject = MyDatasMessagesUserList.FirstOrDefault(sub => sub == button.Tag);
            if (subject != null)
            {
                IdOfChoosenUser = subject.MessengeFromId;
            }
        }}


<ListBox x:Name="lbMessagesUsersList" Grid.Column="1" FontSize="13"   ItemsSource="{Binding MyDatasMessagesUserList }" Margin="0,0,0,80">
            <ListBox.ItemContainerStyle>
                <Style TargetType="ListBoxItem">
                    <Setter Property="HorizontalContentAlignment" Value="Stretch"/>
                </Style>
            </ListBox.ItemContainerStyle>
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <Grid VerticalAlignment="Top" Margin="0,0,0,0" Tapped="userTapped"  Tag="{Binding}" >
                        <Grid.RowDefinitions>
                            <RowDefinition Height="*"/>
                            <RowDefinition Height="*"/>
                        </Grid.RowDefinitions>
                        <Grid Grid.Row="0">
                            <Grid.ColumnDefinitions>
                                <ColumnDefinition Width="auto"/>
                                <ColumnDefinition Width="*"/>
                                <ColumnDefinition Width="*"/>
                            </Grid.ColumnDefinitions>
                            <Image Grid.Column="0" Source="layoutGraphics/logo120.png" HorizontalAlignment="Left" VerticalAlignment="Top" Width="40" Height="40" Margin="5,5,0,0"></Image>
                            <TextBlock x:Name="tbMessengerName" Text="{Binding MessengerName}" HorizontalAlignment="Left"
                                                   Foreground="#FF02416C"
                                                   FontSize="16" Grid.Column="1" Margin="10,0,20,0" VerticalAlignment="Center" MinWidth="120"/>
                            <Image x:Name="imgMessengerIsOffline" 
                                                   HorizontalAlignment="Right" 
                                                    Margin="10,0,20,0" Grid.Column="2" VerticalAlignment="Center"  Source="{Binding isUserOnline}"  Width="20" Height="20">
                            </Image>
                        </Grid>
                        <Rectangle Fill="#FF6FB7FF" Grid.Row="1"  Height="1"                          Margin="0,0,0,-20">
                        </Rectangle>
                    </Grid>
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>

2 个答案:

答案 0 :(得分:1)

将网格包裹在ListBoxItem内的DataTemplate中(并在ListBoxItem上设置tap事件)或将网格的背景设置为透明,并且tap事件应该正常工作。

private void userTapped(object sender, TappedRoutedEventArgs e)
{
    var button = sender as ListBoxItem;
    if (button != null)
    {
        var subject = MyDatasMessagesUserList.FirstOrDefault(sub => sub == button.Tag);
        if (subject != null)
        {
            IdOfChoosenUser = subject.MessengeFromId;
        }
    }}


<ListBox x:Name="lbMessagesUsersList" Grid.Column="1" FontSize="13"   ItemsSource="{Binding MyDatasMessagesUserList }" Margin="0,0,0,80">
        <ListBox.ItemContainerStyle>
            <Style TargetType="ListBoxItem">
                <Setter Property="HorizontalContentAlignment" Value="Stretch"/>
                <Setter Property="Padding" Value="0"/>
            </Style>
        </ListBox.ItemContainerStyle>
        <ListBox.ItemTemplate>
            <DataTemplate>
               <ListBoxItem Tapped="userTapped"  Tag="{Binding}">
                <Grid VerticalAlignment="Top" Margin="8,10"  >
                    <Grid.RowDefinitions>
                        <RowDefinition Height="*"/>
                        <RowDefinition Height="*"/>
                    </Grid.RowDefinitions>
                    <Grid Grid.Row="0">
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition Width="auto"/>
                            <ColumnDefinition Width="*"/>
                            <ColumnDefinition Width="*"/>
                        </Grid.ColumnDefinitions>
                        <Image Grid.Column="0" Source="layoutGraphics/logo120.png" HorizontalAlignment="Left" VerticalAlignment="Top" Width="40" Height="40" Margin="5,5,0,0"></Image>
                        <TextBlock x:Name="tbMessengerName" Text="{Binding MessengerName}" HorizontalAlignment="Left"
                                               Foreground="#FF02416C"
                                               FontSize="16" Grid.Column="1" Margin="10,0,20,0" VerticalAlignment="Center" MinWidth="120"/>
                        <Image x:Name="imgMessengerIsOffline" 
                                               HorizontalAlignment="Right" 
                                                Margin="10,0,20,0" Grid.Column="2" VerticalAlignment="Center"  Source="{Binding isUserOnline}"  Width="20" Height="20">
                        </Image>
                    </Grid>
                    <Rectangle Fill="#FF6FB7FF" Grid.Row="1"  Height="1"                          Margin="0,0,0,-20">
                    </Rectangle>
                </Grid>
             </ListBoxItem>
            </DataTemplate>
        </ListBox.ItemTemplate>
    </ListBox>

答案 1 :(得分:0)

我认为您的问题是因为Grid中有3列,但您只使用其中的两列。因此,没有对象可供您单击,因此不会选择该项目。我猜您可以通过

解决问题

1)删除Grid的第三列。

2)将Rectangle(或任何其他控件)添加到Grid的第三列。