Xamarin.iOS中ArcSegment无法动态更新问题求助
ArcSegment动态更新失效问题(Xamarin.iOS/UWP)
问题场景
在Xamarin.iOS中使用ArcSegment时,首次加载正常,但动态修改Point属性后界面无变化(控制台显示值已更改);UWP端同样存在该问题,同时Xamarin.iOS热重载提示找不到Xamarin.HotReload.Translations.resources程序集。
XAML代码
<Path x:Name="PathCircle" Stroke="Black" StrokeThickness="17" StrokeLineJoin="Round" TranslationX="125" TranslationY="530"> <Path.Data > <PathGeometry> <PathFigure StartPoint="0, 0" > <ArcSegment x:Name="CircleClim" Size="80, 80" Point="32, -64" IsLargeArc="False" SweepDirection="Clockwise" /> </PathFigure> </PathGeometry> </Path.Data> </Path>
后台更新代码
private void SwitchCircleClim() { double radius = 80; double angle = (10-temp)*9*Math.PI/180; double x = 80 +(radius * Math.Cos(angle)); double y = (radius * Math.Sin(angle)); CircleClim.Point=new Point(x, y); Console.WriteLine(CircleClim.Point.X); Console.WriteLine(CircleClim.Point.Y); }
解决方法
1. 强制刷新Path的Data属性
ArcSegment属于PathGeometry的子元素,修改其属性后不会自动触发UI更新,需手动重置Path.Data通知界面刷新:
private void SwitchCircleClim() { double radius = 80; double angle = (10-temp)*9*Math.PI/180; double x = 80 +(radius * Math.Cos(angle)); double y = (radius * Math.Sin(angle)); CircleClim.Point=new Point(x, y); // 强制刷新Data属性 var tempData = PathCircle.Data; PathCircle.Data = null; PathCircle.Data = tempData; }
或者直接重新构建PathGeometry,彻底触发更新:
private void SwitchCircleClim() { double radius = 80; double angle = (10-temp)*9*Math.PI/180; double x = 80 +(radius * Math.Cos(angle)); double y = (radius * Math.Sin(angle)); var pathGeometry = new PathGeometry(); var pathFigure = new PathFigure { StartPoint = new Point(0, 0) }; var arcSegment = new ArcSegment { Size = new Size(80, 80), Point = new Point(x, y), IsLargeArc = false, SweepDirection = SweepDirection.Clockwise }; pathFigure.Segments.Add(arcSegment); pathGeometry.Figures.Add(pathFigure); PathCircle.Data = pathGeometry; }
2. 使用数据绑定替代直接修改属性
通过MVVM绑定ArcSegment.Point到ViewModel的可绑定属性,利用数据绑定自动更新机制:
ViewModel定义可绑定属性
private Point _arcPoint; public Point ArcPoint { get => _arcPoint; set { _arcPoint = value; OnPropertyChanged(); } } public event PropertyChangedEventHandler PropertyChanged; protected void OnPropertyChanged([CallerMemberName] string propertyName = null) { PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); }
XAML绑定Point属性
<ArcSegment x:Name="CircleClim" Size="80, 80" Point="{Binding ArcPoint}" IsLargeArc="False" SweepDirection="Clockwise" />
更新ViewModel属性
private void SwitchCircleClim() { double radius = 80; double angle = (10-temp)*9*Math.PI/180; double x = 80 +(radius * Math.Cos(angle)); double y = (radius * Math.Sin(angle)); ArcPoint = new Point(x, y); }
3. 修复Xamarin.iOS热重载问题
针对热重载程序集缺失提示,执行以下操作:
- 卸载并重新安装
Xamarin.HotReloadNuGet包 - 清理解决方案,删除bin/obj文件夹后重新生成项目
- 确认iOS项目目标框架版本与HotReload包兼容
4. UWP端额外处理
UWP中修改ArcSegment属性后,可调用强制重绘方法确保界面更新:
CircleClim.Point=new Point(x, y); PathCircle.InvalidateArrange(); PathCircle.UpdateLayout();
内容的提问来源于stack exchange,提问作者Antoine21000
相关产品推荐
相关产品推荐

