Кнопка внутри ListView не отвечает на ItemClick

#c# #listview #uwp #uwp-xaml

#c# #listview #uwp #uwp-xaml

Вопрос:

У меня есть три кнопки внутри ListView.
Я попытался нажать каждую кнопку, однако функция ItemClick не была запущена.

Существует xaml файл ListView

 <UserControl.Resources>
        <DataTemplate x:Name="DefaultWideSideItemTemplate" x:DataType="ui:AppMenuItem">
            <Grid>
                <ui:ButtonWithIcon IconContent="{x:Bind Icon}"
                                       Content="{x:Bind Name}"
                                       Style="{StaticResource TransparentFontButtonStyle}"
                />
            </Grid>
        </DataTemplate>
        <others:SideMenuItemTemplateSelector DefaultTemplate="{StaticResource DefaultWideSideItemTemplate}" x:Key="WideSideItemTemplateSelector"/>
    </UserControl.Resources>

<ListView Style="{StaticResource HorizontalCenterListView}" 
                  IsItemClickEnabled="True"
                  ItemsSource="{x:Bind MenuItemCollection}"
                  VerticalAlignment="Top"
                  x:Name="SideMenuListView"
                  Loaded="SideMenuListView_Loaded"
                  ItemClick="SideMenuListView_ItemClick"
                  ItemTemplateSelector="{StaticResource WideSideItemTemplateSelector}">
            </ListView>
  

Существует код, в котором был определен ItemClick .

         public event EventHandler<AppMenuItem> SideMenuItemClick;

        private void SideMenuListView_ItemClick(object sender, ItemClickEventArgs e)
        {
          // DO SOMETHING HERE
        }
  

Существует xaml файл ui:ButtonWithIcon

  <Style x:Key="TransparentFontButtonStyle" TargetType="ui:ButtonWithIcon">
        <Setter Property="Background" Value="Transparent"/>
        <Setter Property="BorderBrush" Value="Transparent"/>
        <Setter Property="BorderThickness" Value="0"/>
        <Setter Property="FontSize" Value="30"/>
        <Setter Property="HorizontalAlignment" Value="Center"/>
        <Setter Property="Margin" Value="0,32,0,7"/>
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="ui:ButtonWithIcon">
                    <StackPanel>
                        <TextBlock
                            x:Name="IconContent"
                            Text="{Binding IconContent, RelativeSource={RelativeSource TemplatedParent}}"
                            HorizontalAlignment="Center"
                            FontFamily="{StaticResource SymbolThemeFontFamily}"
                            FontSize="30"/>
                        <TextBlock
                            x:Name="Text"
                            Text="{TemplateBinding Content}"
                            HorizontalAlignment="Center"
                            FontSize="14"
                            Margin="0,10,0,0"/>
                    </StackPanel>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
  

Что я неправильно понял в ListView? Кнопки нельзя использовать в ListView?

Обновление: ButtonWithIcon

     public class ButtonWithIcon : Button
    {
        public static readonly DependencyProperty IconContentProperty =
          DependencyProperty.Register("IconContent", typeof(string), typeof(ButtonWithIcon), new PropertyMetadata(default));

        public string IconContent
        {
            get { return (string)GetValue(IconContentProperty); }
            set { SetValue(IconContentProperty, value); }
        }
    }
  

Обновление 2:

 <DataTemplate x:Name="DefaultWideSideItemTemplate" x:DataType="ui:AppMenuItem">
            <Grid>
                <StackPanel Margin="0,32,0,7">
                    <TextBlock Text="{x:Bind Icon}"
                           HorizontalAlignment="Center"
                           FontFamily="{StaticResource SymbolThemeFontFamily}"
                           FontSize="30"/>
                    <TextBlock 
                           Text="{x:Bind Name}"
                           HorizontalAlignment="Center"
                           Margin="0,10,0,0"
                           FontSize="14"/>
                </StackPanel>
            </Grid>
        </DataTemplate>
  

Ответ №1:

Если ui:ButtonWithIcon это пользовательский элемент управления кнопкой, то это ожидаемое поведение. Когда вы нажимаете на пользовательскую кнопку, событие щелчка фиксируется кнопкой, поэтому ListView событие не запускается ItemClick . Простой способ подтверждения заключается в том, что вы можете щелкнуть по месту, которое не принадлежит пользовательской кнопке. Это должно вызвать ItemClick событие ListView.

Обновление: поскольку ваш код слишком запутанный, я провел простой тест, используя часть вашего кода:

 <ListView HorizontalAlignment="Stretch" 
              VerticalAlignment="Stretch"
              IsItemClickEnabled="True"
              ItemsSource="{x:Bind MenuItemCollection}"
              
              x:Name="SideMenuListView"
              Loaded="SideMenuListView_Loaded"
              ItemClick="SideMenuListView_ItemClick"
              >
        <ListView.ItemTemplate>

            <DataTemplate >
                <Grid>
                    <StackPanel Margin="0,32,0,7">
                       
                        <TextBlock 
                       Text="{Binding}"
                       HorizontalAlignment="Center"
                       Margin="0,10,0,0"
                       FontSize="14"/>
                    </StackPanel>
                </Grid>
            </DataTemplate>
        </ListView.ItemTemplate>
        </ListView>
  

Это работает правильно.

Вы могли бы удалить дополнительные части вашего кода, чтобы сузить проблему. Начните с простого примера, подобного приведенному выше.

Комментарии:

1. Пожалуйста, ознакомьтесь с обновлением. ButtonWithIcon Это пользовательская кнопка. Есть ли способ разрешить ListView запуск события ItemClick?

2. Таким образом, пользовательская кнопка является элементом управления кнопкой. Если вы настаиваете на использовании элемента управления button, единственный способ — отключить кнопку. Установить button.IsEnabled=False .

3. Есть ли другой способ добиться кнопки, подобной двум текстовым блокам, как ButtonWithIcon я упоминал ранее? Спасибо

4. Существуют разные способы создания элемента управления, который выглядит как кнопка. Вы можете выбрать элементы управления, которые вам нравятся. Для меня я бы использовал границу и некоторые текстовые блоки

5. Спасибо за ваше предложение. Я меняю его на обновление 2, как когда-либо, когда когда-либо нажимаю на каждый текстовый блок, ItemClick все еще не срабатывает?