C# UWP(VS2019)程序重复运行结果不一致问题求助
问题分析与解决方案
结合你描述的不稳定现象、代码细节以及已标记解决的提示,我来梳理下核心问题和对应的修复方案:
1. 问题根源
你的程序出现时好时坏的情况,主要来自两个关键问题:
- UI初始化时机错误:在
MainPage构造函数中直接调用绘制逻辑时,MyCanvas还未完成布局初始化,此时设置Canvas.TopProperty和Canvas.LeftProperty的坐标值,无法被布局系统稳定解析,最终导致所有图片坐标重合。 - 图片加载的异步不确定性:默认情况下
BitmapImage采用DelayCreation延迟加载策略,部分图片在被添加到Canvas时还未完成源加载,就会出现“未设置源”的情况。
2. 修复方案
调整UI操作时机
把绘制图片的逻辑移到MainPage的Loaded事件中,此时所有UI元素已经完成初始化和布局,坐标设置会稳定生效:
public MainPage() { this.InitializeComponent(); // 订阅Loaded事件,等待UI完全初始化后再绘制 this.Loaded += MainPage_Loaded; } private void MainPage_Loaded(object sender, RoutedEventArgs e) { DrawSomeImages(); } void DrawSomeImages() { for (int iCt1 = 0; iCt1 < 5; iCt1++) { for (int iCt2 = 0; iCt2 < 5; iCt2++) { makeImage(iCt1, iCt2); } } }
优化图片加载逻辑
修改makeImage方法,强制BitmapImage立即加载图片源,避免延迟导致的图片丢失:
void makeImage(int inTop, int inLeft) { try { Image img1 = new Image(); var bitmap = new BitmapImage(); bitmap.UriSource = new Uri("ms-appx:///Assets/SmileyAngry.png"); // 关闭延迟加载,强制立即加载图片资源 bitmap.CreateOptions = BitmapCreateOptions.None; img1.Source = bitmap; img1.Width = 220; img1.Height = 220; // 明确转换为double类型,避免隐式转换可能的异常 img1.SetValue(Canvas.TopProperty, (double)(inTop * 38)); img1.SetValue(Canvas.LeftProperty, (double)(inLeft * 39)); MyCanvas.Children.Add(img1); } catch (Exception ex) { string thisProc = System.Reflection.MethodBase.GetCurrentMethod().ToString(); Debug.WriteLine($"Error Message: {ex.Message} In {thisProc}"); } }
3. 额外提示(针对内存泄漏排查)
后续实现批量删除按钮时,要注意:
- 删除图片时,务必从
MyCanvas.Children中移除对应的Image对象,同时如果有集合存储这些图片实例,也要同步移除,避免残留引用导致内存泄漏。 - 可以使用VS2019自带的内存分析工具监控内存变化,验证删除操作是否彻底。
内容的提问来源于stack exchange,提问作者ScCrow
相关产品推荐
相关产品推荐

