在Xamarin表单中,我想基于原始源文件的大小设置图像的大小-如果原始为纵向,则更高。
在OnAppearing页面上,我循环浏览图像列表,并在成功加载后使用每个图像得出我需要的尺寸,然后在页面上设置尺寸。
这在手机和平板电脑上的ios上都可以正常运行,但是在Android上却收到错误消息
System.NullReferenceException: Object reference not set to an instance of an object
并且堆栈跟踪告诉我它是在尝试时发生的:
Grid.CalculateAutoCells (System.Double width, System.Double height)
我认为这意味着图像没有时间加载,因此没有宽度或高度。
根据代码,任何人都可以建议任何修改以使其生效?
编辑:
仅注意到它间歇性崩溃,我可以从轮播中打开页面,这很好,然后我回去,打开另一个页面,再次返回并打开同一页面,然后崩溃。
if (v.ContentType == Models.ContentType.Image)
{
CachedImage img = new CachedImage() { CacheType = FFImageLoading.Cache.CacheType.Memory };
var h = 0;
var w = 0;
img.Source = GetNextImage();
img.Success += (sender, e) =>
{
h = e.ImageInformation.OriginalHeight;
w = e.ImageInformation.OriginalWidth;
if (Device.Idiom == TargetIdiom.Phone)
{
if (h > w)
{
img.HeightRequest = 350;
}
else
{
img.HeightRequest = 200;
}
retry = false;
}
if (Device.Idiom == TargetIdiom.Tablet)
{
if (h > w)
{
img.HeightRequest = 800;
}
else
{
img.HeightRequest = 500;
}
}
};
答案 0 :(得分:1)
在Android中,“ OnAppearing”未授予页面已完全加载的权限,因此也许您调用的不是由Android“绘制”的图像,这就是为什么errore是“间歇性的” ...有很多可能Web上的解决方案,但更多依赖于代码。...也许您可以尝试类似的方法:
public YourPage()
{
InitializeComponent();
my_image_resize_function();
}
或将其覆盖为Async:
protected override async void OnAppearing()
{
base.OnAppearing();
await Task.Delay(1000);
my_image_resize_function();
}
答案 1 :(得分:1)
基于Legion的想法,也许有更好的方法来确保页面使用时间延迟首先加载,这是这样的吗?如果OnAppearing()以异步方式(例如,以Uncaught Error: No method named "getDate"(…)
运行),这将阻止OnAppearing()阻止页面上的函数运行:
await OnAppearing()
在任何情况下,无论如何,延时方法都不是很可靠,因此在页面上放置一个命名元素可能会更好,您可以检查是否为null来查看页面是否已完全加载,例如替换后一个函数中的时间延迟:
protected override async void OnAppearing()
{
base.OnAppearing();
asynchronous_image_resize_function()
}
private async void asynchronous_image_resize_function()
{
await Task.Delay(1000);
my_image_resize_function();
}