将UWP应用程序编译为RELEASE时,DataTriggers不起作用

时间:2017-05-23 11:09:05

标签: c# xamarin uwp xamarin.forms

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

<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应用商店应用程序所需)构建 RELEASE 时,数据触发器停止工作,几乎就像它不存在一样所有,没有错误,只是一无所获。

有没有人见过这个或设法解决它?

修改

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

  1. 使用Debug在UWP中运行应用程序 - 看它工作正常
  2. 使用版本在UWP中运行应用程序 - 无法正常工作

2 个答案:

答案 0 :(得分:2)

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

  

&#34;目标调用异常&#34;使用&#34;使用.NET Native编译时   工具链&#34;如果您的UWP应用程序正在引用多个程序集(for   示例第三方控件库,或您的应用程序本身   分成多个PCL),Xamarin.Forms可能无法加载对象   来自这些程序集(例如自定义渲染器)。

     

使用Compile with .NET Native工具链时可能会发生这种情况   这是属性&gt;中UWP应用的一个选项。构建&gt;一般   该项目的窗口。

     

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

这意味着我必须这样做:

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

DataTriggers工作

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

答案 1 :(得分:0)

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

<强> 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包。