【问题标题】:DataTriggers do not work when compiling UWP application as RELEASE将 UWP 应用程序编译为 RELEASE 时,DataTriggers 不起作用
【发布时间】:2017-05-23 11:09:05
【问题描述】:

我有一个使用Xamarin.Forms 构建的UWP 应用程序我在Grid 上有一个简单的DataTrigger,如下所示:

<Grid.Triggers>
    <DataTrigger TargetType="Grid" Binding="{Binding Selected}" Value="True">
         <Setter Property="BackgroundColor" Value="{StaticResource SelectedListItemColour}"/>
    </DataTrigger>
    <DataTrigger TargetType="Grid" Binding="{Binding Selected}" Value="False">
        <Setter Property="BackgroundColor" Value="{StaticResource ContentGridColour}"/>
    </DataTrigger>
</Grid.Triggers>

这在构建为 DEBUG 时非常有效。

但是当我使用 .Net Native Toolchain(Windows Store 应用程序需要)针对 RELEASE 构建时,datatrigger 停止工作,几乎就像它在全部,没有错误,什么都没有。

有没有人以前见过或设法解决它?

编辑:

我添加了一个示例应用程序here。 复制步骤:

  1. 在 UWP 中使用 Debug 运行应用程序 - 看看它工作正常
  2. 使用 Release 在 UWP 中运行应用程序 - 不起作用

【问题讨论】:

  • 我已尝试通过 &lt;DataTrigger TargetType="StackLayout" Binding="{Binding Source={x:Reference MyLanel },Path=Text.Length }" Value="0"&gt; 重现您的问题。当构建为 RELEASE 时它工作正常。您能否提供有关您要监控的control 的更多详细信息?
  • @NicoZhu-MSFT 我已经在问题中添加了一个示例应用程序,其中包含一些重现步骤。请参阅示例。我不知道这是 Microsoft 问题还是 Xamarin 问题

标签: c# xamarin uwp xamarin.forms


【解决方案1】:

所以这是Xamarin.Forms 概述的问题here

使用“使用 .NET Native 编译”时出现“目标调用异常” 工具链”如果您的 UWP 应用程序引用了多个程序集(对于 例如第三方控件库,或者您的应用程序本身是 拆分为多个 PCL),Xamarin.Forms 可能无法加载对象 来自那些程序集(例如自定义渲染器)。

使用 Compile with .NET Native 工具链时可能会发生这种情况 这是“属性”>“构建”>“常规”中 UWP 应用程序的一个选项 项目的窗口。

您可以通过使用特定于 UWP 的 Forms.Init 重载来解决此问题 在 App.xaml.cs 中调用,如下面的代码所示(您应该替换 ClassInOtherAssembly 与您的代码引用的实际类):

这意味着我必须这样做:

Xamarin.Forms.Forms.Init(e, new[] { typeof(Xamarin.Forms.Xaml.Extensions).GetTypeInfo().Assembly });

DataTriggers 工作

请注意 Xamarin 没有记录这一点。为了他们自己的图书馆!!!!

【讨论】:

    【解决方案2】:

    也许你的代码项目中有一些奇怪的东西。我只能根据您提供的项目重现您的问题。我创建了一个新项目,但未能复制它。可以参考以下代码。

    HomePage.xaml

    <ContentPage.BindingContext>
            <local:HomePageViewModel />
        </ContentPage.BindingContext>
        <StackLayout>
            <StackLayout.Triggers>
                <DataTrigger TargetType="StackLayout" Binding="{Binding  IsSelected }" Value="False">
                    <Setter Property="BackgroundColor" Value="Green"/>
                </DataTrigger>
                <DataTrigger TargetType="StackLayout" Binding="{Binding IsSelected}" Value="True">
                    <Setter Property="BackgroundColor" Value="Red"/>
                </DataTrigger>
            </StackLayout.Triggers>
            <Button x:Name="MyBtn" Command="{Binding Trigger}" Text="ClickMe" />
        </StackLayout>
    

    HomePageViewModel.cs

     public class HomePageViewModel : INotifyPropertyChanged
     {
         public event PropertyChangedEventHandler PropertyChanged;
         public void OnPropertyChanged([CallerMemberName] string PropertyName = null)
         {
             this.PropertyChanged(this,new PropertyChangedEventArgs(PropertyName));
         }
    
         private bool _isSelected;
         public bool IsSelected
         {
             get { return _isSelected; }
             set
             {
                 _isSelected = value;
                 OnPropertyChanged();
             }
         }
    
         private Command _trigger;
         public Command Trigger
         {
             get
             {
                 return _trigger
                     ?? (_trigger = new Command(
                     () =>
                     {
                         IsSelected = !IsSelected;
                     }));
             }
         }
     }
    

    我已将code sample 上传到 github。请注意,我使用了 INotifyPropertyChanged 而不是 Mvvnlight nuget 包。

    【讨论】:

    • 感谢您的帮助。在 Xamarin 论坛上的一些人的帮助下,我设法找到了问题的根源。它是与 Xamarin.Forms 相关的问题,我已经为其他人发布了答案
    猜你喜欢
    • 2017-02-05
    • 2019-09-19
    • 2016-12-28
    • 2023-03-20
    • 1970-01-01
    • 2018-10-23
    • 1970-01-01
    • 1970-01-01
    • 2022-09-28
    相关资源
    最近更新 更多