Xamarin.CommunityToolKit TouchEffect.Command 在 UWP 中不起作用

Posted

技术标签:

【中文标题】Xamarin.CommunityToolKit TouchEffect.Command 在 UWP 中不起作用【英文标题】:Xamarin.CommunityToolKit TouchEffect.Command not working in UWP 【发布时间】:2021-10-29 18:05:12 【问题描述】:

我无法成功使 xct:TouchEffect.Command 在 UWP 上运行,同时:

它在同一个项目中适用于 android ... 没有构建错误或警告

我做了一个很小的项目来测试它:

    在VS2019中启动一个新的Mobile APP项目

    添加 Xamarin.CommunityToolKit

    在 Mainpage.xaml.cs 中添加两个属性(好的,它可以更好地实现但它可以工作):

     private int count = 10;
     public  int Count
     
         get => count;
         set
         
             count = value;
             OnPropertyChanged(nameof(Count));
         
     
    
     public ICommand PressedCommand => new Command ( () => Count++ );
    

    像这样更新 MainPage.xaml:

<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:xct="http://xamarin.com/schemas/2020/toolkit"
             x:Class="CommunityToolKit.MainPage"
             x:Name="this">

    <StackLayout>

        <Frame BackgroundColor="#2196F3" Padding="24" CornerRadius="0">
            <Label Text="Welcome to Xamarin.Forms!" HorizontalTextAlignment="Center" TextColor="White" FontSize="36"/>
        </Frame>
        <StackLayout BackgroundColor="IndianRed"
                     xct:TouchEffect.Command="Binding Path=PressedCommand, Source=x:Reference this">
            <Label Text="Start developing now" FontSize="Title" Padding="30,10,30,10"/>
            <Label Text="Make changes to your XAML file and save" FontSize="16" Padding="30,0,30,0"/>
        </StackLayout>

        <Label Text="Binding Path=Count, Source=x:Reference this" Padding="30" HorizontalOptions="Center"/>
        <Button Text="Click Me" Command="Binding Path=PressedCommand, Source=x:Reference this"/>
    </StackLayout>

</ContentPage>

按钮命令的绑定适用于 UWP 和 Android 项目。但是应用于 StackLayout 的 touchEffect 绑定在 UWP 项目上不起​​作用(当我单击 IndianRed 背景或 StackLayout 中的任何位置时)。

我错过了什么?!?有什么想法吗?

编辑

我提到我知道这个帖子:https://github.com/xamarin/XamarinCommunityToolkit/issues/1456

所以我的选择目前如下: Xamarin 5.0.0.2012 版本

【问题讨论】:

奇怪了,官方代码样例here也是一样的代码。 是的,这很奇怪很无聊......我用项目github.com/BelightWavre/CommunityToolKit做了一个GitHub repo 请回滚 1.0 版,它可以按预期工作。请查看打击答案 你试过了吗? 1.0版本对你有用吗? 【参考方案1】:

我认为您需要公共 getter 和 setter 才能使命令正常工作。这是我迄今为止的经验。尝试在您的命令中添加公共获取,如下所示:

public ICommand PressedCommand  get;  => new Command ( () => Count++ );

【讨论】:

我试过这个:public ICommand PressedCommand get => new Command(() => Count++); 但它不会改变任何东西。【参考方案2】:

Xamarin.CommunityToolKit TouchEffect.Command 在 UWP 中不起作用

最新的CommunityToolKit 版本已知问题,但在早期版本中运行良好。

目前有一个解决方法可以回滚到Xamarin.CommunityToolKit 1.0.0 版。官方代码示例使用的版本是1.0.0。

【讨论】:

感谢回复,我将包降级到 1.0.0,但它还不能工作。我在 GitHub 上升级了我的示例。太令人沮丧了......我错过了什么?!? 我从未读过有关此 Xamarin.CommunityToolKit.Markup 的任何内容。添加“Xamarin.CommunityToolKit.Markup (1.0.0) page”是什么意思?我在所有项目(UWP/Android)上添加了 Nuget 包。然后 ?如何引用它? 只需将其添加到表单项目中。请参考这个document 是的,我找到了一些东西,但不太好......对于同一个项目(以及这里讨论的 Nuget 包安装),它可以在调试模式下工作,但不能在发布模式下工作。无缝地没有触发错误。这对你来说意味着/揭示了什么?【参考方案3】:

好的,我在 Xamarin.CommunityToolKit project here 上从 AndreiMisiukevich 那里得到了解决方案

为了让 ToolKit 在 UWP 发布模式下运行(它已经按照标准在调试模式下运行),我必须在 UWP 项目的文件 App.xaml.cs 中添加这些行:

var assembliesToInclude = new List<Assembly>()  typeof(Xamarin.CommunityToolkit.Effects.TouchEffect).GetTypeInfo().Assembly ;
Xamarin.Forms.Forms.Init(e, assembliesToInclude);

它适用于 CommunityToolKit 1.2.0 版和 Xamarin 5.0.0.2083。

事实上,当我使用 Rg.Plugins.Popup 时,我将这些行转换为:

var assembliesToInclude = new List<Assembly>()  typeof(Xamarin.CommunityToolkit.Effects.TouchEffect).GetTypeInfo().Assembly ;
assembliesToInclude.AddRange(Rg.Plugins.Popup.Popup.GetExtraAssemblies());
Xamarin.Forms.Forms.Init(e, assembliesToInclude);

感谢大家的建议和 AndreiMisiukevich 的解决方案。

【讨论】:

以上是关于Xamarin.CommunityToolKit TouchEffect.Command 在 UWP 中不起作用的主要内容,如果未能解决你的问题,请参考以下文章

从 ViewModel 调用视图中的方法