首页 > 解决方案 > PoinerReleased 或 Command 未在自定义控件中触发

问题描述

我创建了一个自定义按钮,继承自 ButtonBase 类。我为所有事件添加了故事板,例如 PointerPressed、PointerReleased、PointerEntered 和 PointerExited。在我将 Command & CommandParameter 属性添加到调用项目中的自定义按钮之前,它工作正常。我在我的自定义按钮控件中找到了这些属性,因为它是从 ButtonBase 类继承的。

但是如果我添加 e.Handled = true; 在 PointerPressed 事件中,命令属性有效,但 PointerReleased 的情节提要不会触发。如果我删除 e.Handled = true; 在 PointerPressed 事件中,命令属性不起作用,但 PointerReleased 的情节提要按预期和编程工作。为简单起见,我省略了 .cs 文件代码。只不过是调用相应故事板的事件。如何解决这个问题?

<ButtonBase
x:Class="CustomButtonWithMvvmCommand.Views.Usercontrols.BtnCust2.ButtonCust2"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:CustomButtonWithMvvmCommand.Views.Usercontrols.BtnCust2"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"
d:DesignHeight="300"
d:DesignWidth="400"
IsEnabled="True"
IsTapEnabled="True"
IsTabStop="True"   
IsRightTapEnabled="False"
SizeChanged="GrdBase_OnSizeChanged">

<ButtonBase.Resources>

        <Storyboard x:Name="StoryPointerEntered3" AutoReverse="False">
            <DoubleAnimation Duration="00:00:0.10" Storyboard.TargetName="GrdBase" 
                         Storyboard.TargetProperty="(UIElement.RenderTransform).(CompositeTransform.ScaleX)" To="0.92"/>
            <DoubleAnimation Duration="00:00:0.10" Storyboard.TargetName="GrdBase" 
                         Storyboard.TargetProperty="(UIElement.RenderTransform).(CompositeTransform.ScaleY)" To="0.97"/>
            <DoubleAnimation Duration="00:00:0.10" Storyboard.TargetName="GrdBase" 
                         Storyboard.TargetProperty="(UIElement.RenderTransform).(CompositeTransform.TranslateX)" To="0"/>
            <DoubleAnimation Duration="00:00:0.10" Storyboard.TargetName="GrdBase" 
                         Storyboard.TargetProperty="(UIElement.RenderTransform).(CompositeTransform.TranslateY)" To="0"/>
        </Storyboard>

        <Storyboard x:Name="StoryPointerExited3" AutoReverse="False">
            <DoubleAnimation Duration="00:00:0.10" Storyboard.TargetName="GrdBase" 
                         Storyboard.TargetProperty="(UIElement.RenderTransform).(CompositeTransform.ScaleX)" To="1"/>
            <DoubleAnimation Duration="00:00:0.10" Storyboard.TargetName="GrdBase" 
                         Storyboard.TargetProperty="(UIElement.RenderTransform).(CompositeTransform.ScaleY)" To="1"/>
            <DoubleAnimation Duration="00:00:0.10" Storyboard.TargetName="GrdBase" 
                         Storyboard.TargetProperty="(UIElement.RenderTransform).(CompositeTransform.TranslateX)" To="0"/>
            <DoubleAnimation Duration="00:00:0.10" Storyboard.TargetName="GrdBase" 
                         Storyboard.TargetProperty="(UIElement.RenderTransform).(CompositeTransform.TranslateY)" To="0"/>
        </Storyboard>

        <Storyboard x:Name="StoryPointerDown3" AutoReverse="False">
            <DoubleAnimation Duration="00:00:0.05" Storyboard.TargetName="GrdBase" 
                         Storyboard.TargetProperty="(UIElement.RenderTransform).(CompositeTransform.ScaleX)" To="0.82"/>
            <DoubleAnimation Duration="00:00:0.05" Storyboard.TargetName="GrdBase" 
                         Storyboard.TargetProperty="(UIElement.RenderTransform).(CompositeTransform.ScaleY)" To="0.9"/>
            <DoubleAnimation Duration="00:00:0.05" Storyboard.TargetName="GrdBase" 
                         Storyboard.TargetProperty="(UIElement.RenderTransform).(CompositeTransform.TranslateX)" To="0"/>
            <DoubleAnimation Duration="00:00:0.05" Storyboard.TargetName="GrdBase" 
                         Storyboard.TargetProperty="(UIElement.RenderTransform).(CompositeTransform.TranslateY)" To="0"/>
        </Storyboard>

        <Storyboard x:Name="StoryPointerUp3" AutoReverse="False">

        <DoubleAnimation Duration="00:00:0.05" Storyboard.TargetName="GrdBase" 
                         Storyboard.TargetProperty="(UIElement.RenderTransform).(CompositeTransform.ScaleX)" To="1.0"/>
        <DoubleAnimation Duration="00:00:0.05" Storyboard.TargetName="GrdBase" 
                         Storyboard.TargetProperty="(UIElement.RenderTransform).(CompositeTransform.ScaleY)" To="1.0"/>

        <DoubleAnimation Duration="00:00:0.05" Storyboard.TargetName="GrdBase" 
                         Storyboard.TargetProperty="(UIElement.RenderTransform).(CompositeTransform.TranslateX)" To="0"/>
        <DoubleAnimation Duration="00:00:0.05" Storyboard.TargetName="GrdBase" 
                         Storyboard.TargetProperty="(UIElement.RenderTransform).(CompositeTransform.TranslateY)" To="0"/>


        </Storyboard>

    </ButtonBase.Resources>

<Grid x:Name="GrdBase" 
    Tapped="GrdBase_OnTapped"
    RenderTransformOrigin="0.5,0.5"
    VerticalAlignment="Center"
    IsTapEnabled="True"                      
    PointerPressed="ButtonBase_PointerPressed"
    PointerReleased="ButtonBase_PointerReleased"
    PointerCanceled="GrdBase_PointerCanceled"
    PointerCaptureLost="GrdBase_PointerCaptureLost"
    PointerEntered="ImgBack_OnPointerEntered"
    PointerExited="ImgBack_OnPointerExited"
    Background="Transparent">

        <Grid>
        <!--some controls-->
        </Grid>

        <Grid.RenderTransform>
            <CompositeTransform/>
        </Grid.RenderTransform>
    </Grid>
</ButtonBase>

标签: uwpcustom-controlsuwp-xaml

解决方案


推荐阅读