Xamarin.Forms UWP项目中Editor控件调整大小时出现抖动如何解决?
修复Xamarin UWP中Editor控件调整大小时的抖动问题
问题根因
该抖动是Xamarin.Forms UWP渲染层的布局时序冲突导致的:原生UWP的TextBox(Editor的底层原生控件)计算高度的逻辑,和Xamarin.Forms的跨平台布局重算逻辑不同步,会连续触发多次无效布局重绘,最终表现为大小跳变抖动。你之前加Thread.Sleep能临时生效,本质是强制阻塞UI线程等待原生侧高度计算完成,属于副作用极大的临时 workaround,会阻塞输入响应,不推荐生产环境使用。
可行修复方案
方案1:升级Xamarin.Forms版本
该问题属于Xamarin.Forms的已知Bug,在5.0.0.2012及以上的稳定版已经官方修复,优先直接升级Xamarin.Forms依赖包即可解决,无需修改业务代码。
方案2:自定义Editor渲染器(兼容旧版本Xamarin.Forms)
如果无法升级版本,可以通过自定义渲染器直接接管高度更新逻辑,对齐原生UWP的高度计算时序:
- 共享项目中新建自定义Editor类:
public class AutoSizeEditor : Editor { }
- UWP项目中添加对应渲染器:
using Xamarin.Forms.Platform.UWP; using YourAppName; using YourAppName.UWP.Renderers; [assembly: ExportRenderer(typeof(AutoSizeEditor), typeof(AutoSizeEditorRenderer))] namespace YourAppName.UWP.Renderers { public class AutoSizeEditorRenderer : EditorRenderer { protected override void OnElementChanged(ElementChangedEventArgs<Editor> e) { base.OnElementChanged(e); if (Control != null) { Control.AcceptsReturn = true; // 关闭Xamarin默认的自动大小逻辑,用原生自带的自动大小 Control.Height = double.NaN; Control.MinHeight = 32; // 可根据需求调整最小高度 } } } }
- XAML中直接使用自定义控件即可:
<StackLayout> <local:AutoSizeEditor /> </StackLayout>
方案3:异步调度高度更新(不改渲染器的轻量方案)
如果不想引入自定义渲染器,也可以把高度更新逻辑放到低优先级的UI调度队列中,等原生内容渲染完成后再更新:
protected override async void OnTextChanged(string oldValue, string newValue) { base.OnTextChanged(oldValue, newValue); // 等待原生控件内容渲染完成后再更新高度 await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Low, () => { InvalidateMeasure(); }); }
内容的提问来源于stack exchange,提问作者Oleksa
相关产品推荐
相关产品推荐

