You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于ContentView的自定义按钮TouchBehavior异常问题求助

问题解决方案

一、修复状态不恢复与命令触发异常

1. 正确绑定TouchBehavior的专属命令

TouchBehavior的默认Command对应**触摸完成(按下+释放)**动作,你需要用PressedCommand和ReleasedCommand分别绑定按下、释放逻辑,同时不要手动干预状态切换——TouchBehavior会自动管理VisualState:

<ContentView x:Name="ThisButton">
    <ContentView.Behaviors>
        <toolkit:TouchBehavior
            BindingContext="{Binding Path=BindingContext, Source={x:Reference ThisButton}, x:DataType=local:MyButton}"
            DefaultAnimationDuration="50"
            DefaultAnimationEasing="{x:Static Easing.CubicInOut}"
            PressedCommand="{Binding ButtonPressedCommand}"
            ReleasedCommand="{Binding ButtonReleasedCommand}" />
    </ContentView.Behaviors>
    <!-- 按钮内容 -->
</ContentView>

后台代码添加释放命令,移除手动状态设置:

[RelayCommand]
private void ButtonPressed()
{
    Debug.WriteLine("Button pressed");
    // 无需手动切换状态,TouchBehavior自动处理
}

[RelayCommand]
private void ButtonReleased()
{
    Debug.WriteLine("Button released");
    // 释放后TouchBehavior自动切回Normal状态
}

2. 确保VisualState定义规范

检查ContentView的VisualState配置,确保包含完整的状态组:

<ContentView.VisualStateManager.VisualStates>
    <VisualStateGroup x:Name="CommonStates">
        <VisualState x:Name="Normal">
            <VisualState.Setters>
                <Setter Property="BackgroundColor" Value="LightGray" />
            </VisualState.Setters>
        </VisualState>
        <VisualState x:Name="Pressed">
            <VisualState.Setters>
                <Setter Property="BackgroundColor" Value="DarkGray" />
            </VisualState.Setters>
        </VisualState>
    </VisualStateGroup>
</ContentView.VisualStateManager.VisualStates>

二、解决TaskCanceledException异常

这个异常是CommunityToolkit.Maui TouchBehavior的已知问题,由快速触摸导致动画任务被取消引发,可通过以下方式处理:

  • 忽略日志:该异常不影响功能,可在项目日志过滤规则中排除System.Threading.Tasks.TaskCanceledException;
  • 降级版本:尝试回退到8.0.0之前的CommunityToolkit.Maui版本(需自行测试适配性);
  • 自定义触摸逻辑替代:完全脱离TouchBehavior,用原生GestureRecognizer实现:
<ContentView x:Name="ThisButton">
    <ContentView.GestureRecognizers>
        <TouchGestureRecognizer
            Pressed="OnButtonPressed"
            Released="OnButtonReleased" />
    </ContentView.GestureRecognizers>
    <!-- 按钮内容 -->
</ContentView>

后台代码手动管理状态:

private void OnButtonPressed(object sender, EventArgs e)
{
    VisualStateManager.GoToState(this, "Pressed");
    Debug.WriteLine("Button pressed");
    // 执行按下逻辑
}

private void OnButtonReleased(object sender, EventArgs e)
{
    VisualStateManager.GoToState(this, "Normal");
    Debug.WriteLine("Button released");
    // 执行释放逻辑
}

三、TouchGestureRecognizer行为异常说明

之前的异常是因为同时使用了TouchBehavior和TouchGestureRecognizer,两者触摸事件冲突导致的。如果选择自定义触摸方案,只需保留其中一种即可。


内容的提问来源于stack exchange,提问作者Easy Rhino

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.11 20:33:21