【问题标题】:Button inside ListView not respond to ItemClickListView 内的按钮不响应 ItemClick
【发布时间】:2021-01-29 13:06:16
【问题描述】:

我在 ListView 中有三个按钮。
我尝试单击每个按钮,但是没有触发 ItemClick 功能。

有ListView的xaml文件

<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
        }

ui:ButtonWithIconxaml文件

 <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>

【问题讨论】:

    标签: c# listview uwp uwp-xaml


    【解决方案1】:

    如果ui:ButtonWithIcon 是自定义按钮控件,则这是预期行为。当你点击自定义按钮时,点击事件被按钮捕获,所以ListView不会触发ItemClick事件。一个简单的确认方法是您可以点击不属于自定义按钮的地方。它应该触发 ListView 的ItemClick 事件。

    更新: 由于你的代码太乱,我用你的一些代码做了一个简单的测试:

    <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>
    

    这可以正常工作。

    您可以删除代码的额外部分以缩小问题范围。从像上面这样的简单示例开始。

    【讨论】:

    • 请查看更新。 ButtonWithIcon 是一个自定义按钮。有没有办法让ListView触发ItemClick事件?
    • 所以自定义按钮是一个按钮控件。如果你坚持使用按钮控件,唯一的办法就是禁用按钮。设置button.IsEnabled=False
    • 是否有另一种方法可以像我之前提到的ButtonWithIcon 那样使用两个文本块来实现类似按钮的效果?谢谢
    • 有不同的方法来创建一个看起来像一个按钮的控件。您可以选择您喜欢的控件。对我来说,我会使用边框和一些文本块
    • 感谢您的建议。我将其更改为更新 2,但是当单击每个文本块时,仍然没有触发 ItemClick?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-11
    • 2017-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多