我尝试使用SfDataGrid在Xamarin项目中使用paging(.net标准2.0作为包含视图的共享代码)。
Android项目在我的Motorola G4上的Android 7.1.2(LineageOS 14.1)下运行良好。
但是UWP项目崩溃了。在Visual Studio 2017的调试输出中,我看到以下异常:
Exception thrown: 'System.Reflection.TargetException' in System.Private.CoreLib.dll
System.Reflection.TargetException: Exception of type 'System.Reflection.TargetException' was thrown.
at System.Reflection.RuntimeMethodInfo.ThrowNoInvokeException()
at System.Reflection.RuntimeMethodInfo.InvokeArgumentsCheck(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
at Xamarin.Forms.ImageSource.FromResource(String resource, Assembly sourceAssembly)
at Syncfusion.SfDataGrid.XForms.DataPager.AppearanceManager.GetFirstPageIcon()
at Syncfusion.SfDataGrid.XForms.DataPager.Header.CreateHeaderContent()
at Syncfusion.SfDataGrid.XForms.DataPager.Header..ctor(SfDataPager pager)
at Syncfusion.SfDataGrid.XForms.DataPager.SfDataPager..ctor()
at Foo.BarPage.InitializeComponent()
at Foo.BarPage..ctor()
所有项目include the Nuget package。任何想法为什么失败?对于Android项目,我可以通过自定义Behavior类来设置Grid和Pager以及源,但是在UWP中我只看到这个异常,其中加载分页按钮的图标失败但行为代码从不被调用/调试永远不会在OnAttachedTo
的断点处停止。
知道什么是错的或如何解决它?
//编辑2018-03-13
当我比较文件版本时,我看到适用于16.1451.0.26
和Syncfusion.SfDataGrid.XForms.Android.dll
的Android版本Syncfusion.SfDataGrid.XForms.dll
。但对于UWP来说,存在不匹配。 Syncfusion.SfDataGrid.XForms.UWP.dll
版本为16.14 60 .0.26而Syncfusion.SfDataGrid.XForms.dll
版本为16.1451.0.26。所以 60 到 51 不匹配的缝隙导致UWP下的问题,这可以解释为什么Android应用程序有效,因为这里的DLL具有相同的版本。
有没有人知道带有assemblyBinding的app.config是否仍在UWP中工作以解决此版本不匹配问题并强制将DLL与不同版本一起使用?
//编辑2018-04-04
我试图对它进行更多调查,获得Syncfusion Xamarin组件的源代码,修改它们以使用最新的Xamarin版本2.5.0.280555 Service Release 5并将项目直接添加到我的解决方案中,但我仍然得到相同的错误。
问题出现了directly when I follow the paging guide:
创建一个新的SfDataPager实例
这会直接触发异常:
var appearanceManager = new CustomAppearance();
var dataPager = new SfDataPager
{
AppearanceManager = appearanceManager
};
导致System.Reflection.TargetException
:
System.Reflection.TargetException: Exception of type 'System.Reflection.TargetException' was thrown.
at System.Reflection.RuntimeMethodInfo.ThrowNoInvokeException()
at System.Reflection.RuntimeMethodInfo.InvokeArgumentsCheck(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
at Xamarin.Forms.ImageSource.FromResource(String resource, Assembly sourceAssembly)
at Syncfusion.SfDataGrid.XForms.DataPager.AppearanceManager.GetFirstPageIcon()
at Syncfusion.SfDataGrid.XForms.DataPager.Header.CreateHeaderContent()
at Syncfusion.SfDataGrid.XForms.DataPager.Header..ctor(SfDataPager pager)
at Syncfusion.SfDataGrid.XForms.DataPager.SfDataPager..ctor()
但是在CustomAppearance
类中我重写了GetIcons方法(GetFirstPageIcon,GetLastPageIcon,GetNextPageIcon,GetPreviousPageIcon)
public class CustomAppearance : AppearanceManager
{
public override ImageSource GetFirstPageIcon()
{
var image = ImageSource.FromResource("App.Resources.FirstPageIcon.png");
return image;
}
public override ImageSource GetLastPageIcon()
{
var image = ImageSource.FromResource("App.Resources.LastPageIcon.png");
return image;
}
public override ImageSource GetNextPageIcon()
{
var image = ImageSource.FromResource("App.Resources.NextPageIcon.png");
return image;
}
public override ImageSource GetPreviousPageIcon()
{
var image = ImageSource.FromResource("App.Resources.PrevPageIcon.png");
return image;
}
}
在Android中一切正常。在这里,我可以逐步完成所有覆盖并获取我的自定义图像,并在寻呼机中显示。在UWP项目中,我遇到了崩溃。
我也followed the steps which should be done in Release mode only,加载程序集:
List<Assembly> assembliesToInclude = new List<Assembly>();
//Now, add all the assemblies your app uses
assembliesToInclude.Add(typeof(SfDataGridRenderer).GetTypeInfo().Assembly);
assembliesToInclude.Add(typeof(SfDataPager).GetTypeInfo().Assembly);
Xamarin.Forms.DependencyService.Register<SfDataGridRenderer>();
Xamarin.Forms.DependencyService.Register<SfDataPager>();
// replaces Xamarin.Forms.Forms.Init(e);
Xamarin.Forms.Forms.Init(e, assembliesToInclude);
因此加载了Syncfusion.SfDataGrid.XForms.dll
和Syncfusion.SfDataGrid.XForms.UWP.dll
DLL,但加载Syncfusion.SfDataGrid.XForms.dll
的图片失败了:
我现在没有想法。
答案 0 :(得分:1)
//编辑2018-07-23
问题最终在16.2.0.42中修复,他们现在添加了typeof(SfDataPager).GetTypeInfo().Assembly
电话。
将Syncfusion.SfDataGrid.XForms的源代码添加到我的解决方案后,我在Syncfusion.SfDataGrid.XForms.DataPager.Header.CreateHeaderContent()
设置了一个断点。这里创建了图像:
var image = new Image () {
Source = this.Datapager.AppearanceManager.GetFirstPageIcon(),
HorizontalOptions = LayoutOptions.Center,
VerticalOptions = LayoutOptions.Center,
};
这里调用GetFirstPageIcon()
。所以我跳进了代码并看到了
public virtual ImageSource GetFirstPageIcon()
{
return ImageSource.FromResource("Syncfusion.SfDataGrid.XForms.Resources.FirstPageIcon.png");
}
此处ImageSource.FromResource
System.Reflection.TargetException
被提出。所以调用ImageSource.FromResource
失败了,因为它转化为:
public virtual ImageSource GetFirstPageIcon()
{
return ImageSource.FromResource("Syncfusion.SfDataGrid.XForms.Resources.FirstPageIcon.png", null);
}
第二个参数默认为null。这是加载图像的装配。
在UWP下,这会导致问题,可以通过将方法更改为
来修复 public virtual ImageSource GetFirstPageIcon()
{
return ImageSource.FromResource("Syncfusion.SfDataGrid.XForms.Resources.FirstPageIcon.png", typeof(SfDataPager).GetTypeInfo().Assembly);
}
现在Xamarin使用Syncfusion DLL加载资源而不是我的应用程序(不包含图像的.net标准共享代码库)。
Xamarin tracker / forum中的其他用户也发现了这一点,但是not documented by Microsoft。
所以我必须等待Syncfusion的错误修正,他们会在typeof(SfDataPager).GetTypeInfo().Assembly
更改所有方法以包含ImageSource.FromResource
作为第二个参数。
答案 1 :(得分:0)
感谢您与Syncfusion支持小组联系。
当您的示例和SfDataGrid程序集之间存在Xamarin NuGet包不匹配时,通常会发生此错误。我们的16.1.0.24版本支持版本2.1的Xamarin NuGet。
Xamarin建议将NuGet包内联,以避免潜在的问题。因此,请卸载所有其他版本的NuGets并在PCL和示例的渲染器项目中使用2.1版本。还要确保在任何PCL和渲染器项目中都没有安装其他版本的Xamarin NuGets。在运行之前清理并重建项目。您可以从我们的自述信息中查看Syncfusion控件的软件要求。
自述文件链接: http://files2.syncfusion.com/Installs/v16.1.0.24/ReadMe/Xamarin_Forms.html
此致 素里亚