Xamarin Forms中Image控件SizeChanged事件仅触发一次如何解决
Image控件更换图片后SizeChanged事件不触发的解决方法
根本原因
SizeChanged事件的触发条件是控件的实际渲染尺寸发生变化,如果移除原有图片后设置的新图片和之前图片的渲染尺寸一致,或者移除旧图片后没有主动触发控件的布局重绘,系统会判定尺寸无变更,就不会触发该事件。
可行解决方案
- 方案1:设置图片前主动重置控件尺寸
每次给Image赋值新的图片源之前,先主动把Image的WidthRequest和HeightRequest重置为自适应参数(不同平台参数不同:Xamarin.Forms设为-1,Android设为WRAP_CONTENT,Flutter可设为double.infinity配合父容器约束),强制控件先进入一次布局重新计算流程:
以下为Xamarin.Forms示例代码:// 重置尺寸触发布局更新 myImage.WidthRequest = -1; myImage.HeightRequest = -1; // 再设置新的图片源 myImage.Source = ImageSource.FromFile(newImagePath); - 方案2:监听图片源加载完成事件替代SizeChanged
直接监听Image控件的图片加载完成事件,加载完成后主动读取图片的原始尺寸,再手动设置控件宽高,该方案比依赖SizeChanged稳定性更高:
以下为Flutter示例代码:Image image = Image.file(File(newImagePath)); image.image.resolve(ImageConfiguration.empty).addListener( ImageStreamListener((ImageInfo info, bool synchronousCall) { // 拿到图片原始宽高 double imgWidth = info.image.width.toDouble(); double imgHeight = info.image.height.toDouble(); // 按业务需求计算控件宽高后赋值 setState(() { imageWidgetWidth = imgWidth; imageWidgetHeight = imgHeight; }); }) ); - 方案3:强制触发控件布局重绘
原生平台开发可以在设置新图片源后,主动调用控件的InvalidateMeasure()(Xamarin)/requestLayout()(Android)/setNeedsLayout()(iOS)方法,强制控件重新测量自身尺寸,只要尺寸发生变化就会触发SizeChanged事件。
内容的提问来源于stack exchange,提问作者Amose Kumar
相关产品推荐
相关产品推荐

