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

如何让.NET MAUI中Label/StackLayout的CommunityToolkit TouchBehavior生效

解决MAUI中TouchBehavior的LongPressCommand不触发问题

核心问题及修复步骤

1. 修复Command初始化的语法错误

你的C#代码中Command的lambda表达式存在语法错误,导致Command未正确创建:

// 错误写法
LongPressCommand = new Command(() =
{
    Console.WriteLine("Long press");
});

// 正确写法
LongPressCommand = new Command(() =>
{
    Console.WriteLine("Long press");
});

2. 确保CommunityToolkit.Maui已正确初始化

在MauiProgram.cs中必须添加Toolkit的初始化代码,否则所有Toolkit组件都无法工作:

using CommunityToolkit.Maui;

namespace MauiApp2;

public static class MauiProgram
{
    public static MauiApp CreateMauiApp()
    {
        var builder = MauiApp.CreateBuilder();
        builder
            .UseMauiApp<App>()
            .UseMauiCommunityToolkit() // 必须添加这一行
            .ConfigureFonts(fonts =>
            {
                fonts.AddFont("OpenSans-Regular.ttf", "OpenSansRegular");
                fonts.AddFont("OpenSans-Semibold.ttf", "OpenSansSemibold");
            });

        return builder.Build();
    }
}

3. 调整TouchBehavior的附加目标

  • VerticalStackLayout是布局控件,默认不接收触摸输入事件,因此附加在它上面的TouchBehavior无法触发。建议移除该布局上的TouchBehavior,或者将其替换为可交互容器(如Frame)。
  • Label默认不是交互控件,需要确保它能接收触摸事件:
    在Label的XAML中添加IsEnabled="True"和BackgroundColor="Transparent"(确保触摸区域可被检测):
<Label Text="Press me" IsEnabled="True" BackgroundColor="Transparent">
    <Label.Behaviors>
        <toolkit:TouchBehavior
            LongPressDuration="750"
            LongPressCommand="{Binding LongPressCommand}"/>
    </Label.Behaviors>
</Label>

4. 优化绑定上下文设置时机

建议先初始化Command,再设置BindingContext,避免可能的绑定延迟问题:

public MainPage()
{
    // 先初始化Command
    LongPressCommand = new Command(() =>
    {
        Console.WriteLine("Long press");
    });
    InitializeComponent();
    BindingContext = this; // 再设置绑定上下文
}

完整修正后的代码

XAML代码

<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:toolkit="http://schemas.microsoft.com/dotnet/2022/maui/toolkit"
             xmlns:local="clr-namespace:MauiApp2"
             x:DataType="local:MainPage"
             x:Class="MauiApp2.MainPage">

    <VerticalStackLayout Padding="30,0" Spacing="25">
        <Label Text="Press me" IsEnabled="True" BackgroundColor="Transparent">
            <Label.Behaviors>
                <toolkit:TouchBehavior
                    LongPressDuration="750"
                    LongPressCommand="{Binding LongPressCommand}"/>
            </Label.Behaviors>
        </Label>
    </VerticalStackLayout>

</ContentPage>

C#代码

public partial class MainPage : ContentPage
{
    private Command? _longPressCommand;
    public Command? LongPressCommand
    {
        get => _longPressCommand;
        set
        {
            _longPressCommand = value;
            OnPropertyChanged(nameof(LongPressCommand));
        } 
    }

    public MainPage()
    {
        LongPressCommand = new Command(() =>
        {
            Console.WriteLine("Long press");
        });
        InitializeComponent();
        BindingContext = this;
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.11 16:33:28