【问题标题】:Fire click on templated button触发点击模板按钮
【发布时间】:2021-05-07 15:09:10
【问题描述】:

我想创建一个自定义按钮显示模板。出于某种原因,我不会使用Style={ThemeResource ButtonRevealStyle}。所以,我在按钮控件模板中添加了 ListViewItem。

<Style TargetType="Button" x:Key="ButtonListView">
    <Setter Property="IsTabStop" Value="False"/>
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="Button">
                <Grid Control.IsTemplateFocusTarget="True">
                    <StackPanel>
                        <ListViewItem>
                            <ContentPresenter></ContentPresenter>
                        </ListViewItem>
                    </StackPanel>
                </Grid>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>


<Button Style="{ThemeResource ButtonListView}" Click="list_refresh">
    <TextBlock Text="Button Content"/>
</Button>

插图:

但是当我点击它时点击事件不会触发。我认为它会触发 ListViewItem,而不是按钮。最令人困惑的是,它可以使用键盘触发。

【问题讨论】:

    标签: xaml uwp


    【解决方案1】:

    点击模板按钮

    正如@Vincent 所说,ListViewItem 是第一个捕获您的点击事件的,对于您的场景,我们建议您自定义按钮显示样式并使用 ListViewItem 显示主题资源。或者使用ButtonTapped事件替换。

    例如:

    <Style x:Key="CudtomButtonRevealStyle" TargetType="Button">
        <Setter Property="Background" Value="{ThemeResource ListViewItemRevealBackground}" />
        <Setter Property="Foreground" Value="{ThemeResource ButtonForeground}" />
        <Setter Property="BorderBrush" Value="{ThemeResource ListViewItemRevealBorderBrush}" />
        <Setter Property="BorderThickness" Value="{ThemeResource ButtonRevealBorderThemeThickness}" />
        <Setter Property="Padding" Value="{ThemeResource ButtonPadding}" />
        <Setter Property="HorizontalAlignment" Value="Left" />
        <Setter Property="VerticalAlignment" Value="Center" />
        <Setter Property="FontFamily" Value="{ThemeResource ContentControlThemeFontFamily}" />
        <Setter Property="FontWeight" Value="Normal" />
        <Setter Property="FontSize" Value="{ThemeResource ControlContentThemeFontSize}" />
        <Setter Property="UseSystemFocusVisuals" Value="{StaticResource UseSystemFocusVisuals}" />
        <Setter Property="FocusVisualMargin" Value="-3" />
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="Button">
                    <Grid
                        x:Name="RootGrid"
                        Background="{TemplateBinding Background}"
                        CornerRadius="{TemplateBinding CornerRadius}">
                        <ContentPresenter
                            x:Name="ContentPresenter"
                            Padding="{TemplateBinding Padding}"
                            HorizontalContentAlignment="{TemplateBinding HorizontalContentAlignment}"
                            VerticalContentAlignment="{TemplateBinding VerticalContentAlignment}"
                            AutomationProperties.AccessibilityView="Raw"
                            BorderBrush="{TemplateBinding BorderBrush}"
                            BorderThickness="{TemplateBinding BorderThickness}"
                            Content="{TemplateBinding Content}"
                            ContentTemplate="{TemplateBinding ContentTemplate}"
                            ContentTransitions="{TemplateBinding ContentTransitions}"
                            CornerRadius="{TemplateBinding CornerRadius}" />
    
                        <VisualStateManager.VisualStateGroups>
                            <VisualStateGroup x:Name="CommonStates">
                                <VisualState x:Name="Normal">
    
                                    <Storyboard>
                                        <PointerUpThemeAnimation Storyboard.TargetName="RootGrid" />
                                    </Storyboard>
                                </VisualState>
    
                                <VisualState x:Name="PointerOver">
                                    <VisualState.Setters>
                                        <Setter Target="RootGrid.(RevealBrush.State)" Value="PointerOver" />
                                        <Setter Target="RootGrid.Background" Value="{ThemeResource ListViewItemRevealBackgroundPointerOver}" />
                                        <Setter Target="ContentPresenter.BorderBrush" Value="{ThemeResource ListViewItemRevealBorderBrushPointerOver}" />
                                        <Setter Target="ContentPresenter.Foreground" Value="{ThemeResource ButtonForegroundPointerOver}" />
                                    </VisualState.Setters>
    
                                    <Storyboard>
                                        <PointerUpThemeAnimation Storyboard.TargetName="RootGrid" />
                                    </Storyboard>
                                </VisualState>
    
                                <VisualState x:Name="Pressed">
                                    <VisualState.Setters>
                                        <Setter Target="RootGrid.(RevealBrush.State)" Value="Pressed" />
                                        <Setter Target="RootGrid.Background" Value="{ThemeResource ListViewItemRevealBackgroundPressed}" />
                                        <Setter Target="ContentPresenter.BorderBrush" Value="{ThemeResource ListViewItemRevealBorderBrushPressed}" />
                                        <Setter Target="ContentPresenter.Foreground" Value="{ThemeResource ButtonForegroundPressed}" />
                                    </VisualState.Setters>
    
                                    <Storyboard>
                                        <PointerDownThemeAnimation Storyboard.TargetName="RootGrid" />
                                    </Storyboard>
                                </VisualState>
    
                                <VisualState x:Name="Disabled">
                                    <VisualState.Setters>
                                        <Setter Target="RootGrid.Background" Value="{ThemeResource ButtonRevealBackgroundDisabled}" />
                                        <Setter Target="ContentPresenter.BorderBrush" Value="{ThemeResource ButtonRevealBorderBrushDisabled}" />
                                        <Setter Target="ContentPresenter.Foreground" Value="{ThemeResource ButtonForegroundDisabled}" />
                                    </VisualState.Setters>
                                </VisualState>
                            </VisualStateGroup>
                        </VisualStateManager.VisualStateGroups>
                    </Grid>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
    

    用法

    <Button
        VerticalAlignment="Bottom"
        Click="Button_Click"
        Content="Connect"
        Style="{ThemeResource CudtomButtonRevealStyle}" />
    

    【讨论】:

    • 如果使用点击事件,如何防止鼠标中键?
    • 你的意思是滚轮点击吗?恐怕我们无法阻止它,它是系统级别的,对于这种情况,我们建议使用上述自定义显示样式。
    【解决方案2】:

    这是专注问题。当您使用键盘时,您可以使用Tab 将焦点移动到Button,因此它会触发点击事件。

    当您使用指针时,按下ButtonListViewItem 是第一个捕获您的点击事件的,您可以在ListViewItem 中添加一个Tapped 事件来证明这一点。

    因此,如果您坚持希望 Button 响应您的指针,我认为您可以删除 ListViewItem

       <ControlTemplate TargetType="Button">
            <Grid Control.IsTemplateFocusTarget="True">
                Add button content here
            </Grid>
        </ControlTemplate>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-08-06
      • 1970-01-01
      • 1970-01-01
      • 2017-06-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多