WPF开发ID卡应用时无法从自定义对话框修改主窗口Canvas宽高
问题根因
你代码里有三个核心错误导致修改不生效:
- 多余的多线程逻辑:WPF所有UI元素必须在同一个UI线程中创建和操作,你单独开线程弹出对话框,两个窗口分属不同线程,UI更新本身就会出现异常,额外调用的
Dispatcher.Run()还会造成主线程阻塞,完全没必要。 - 错误实例化新主窗口:你在新建项目对话框中写的
MainWindow MainW = new MainWindow();创建的是一个全新的、未显示的主窗口实例,修改的是这个不可见窗口的Canvas属性,不是你当前正在使用的主窗口,自然看不到效果。 - 单位不匹配:你设置的尺寸是英寸数值,而WPF默认的长度单位是「1/96英寸」,直接传入英寸值会导致Canvas尺寸只有几像素,肉眼几乎不可见。
修复方案
1. 修改主窗口代码,移除多线程逻辑,传递当前主窗口实例给对话框
// 新建项目按钮点击事件 private void New_file_Click(object sender, RoutedEventArgs e) { // 直接在当前UI线程弹出对话框,把当前主窗口实例作为参数传给对话框 New_File newFileDiaBox = new New_File(this); // 用模态对话框更符合新建项目的交互逻辑 newFileDiaBox.ShowDialog(); } // 接收对话框窗口传递的数据 internal void GetNewFileData(double W, double H ) { // 英寸转WPF设备无关单位:1英寸=96单位 Working_card.Width = W * 96; Working_card.Height = H * 96; MessageBox.Show( "方法内获取高度值:"+Working_card.Height.ToString()); }
2. 修改新建项目对话框代码,接收主窗口实例,不新建主窗口
首先给New_File窗口添加构造函数接收主窗口实例:
// 新增字段保存传入的主窗口实例 private MainWindow _mainWindow; // 新建对话框的构造函数 public New_File(MainWindow mainWindow) { InitializeComponent(); _mainWindow = mainWindow; } New_Project_Handler NPH = new New_Project_Handler(); private void SizeChecker() { if (Standard_sizes.IsChecked == true) { if (CR80.IsChecked == true) { NPH.Width_ = 3.375; NPH.Height_ = 2.125; } else if (CR79.IsChecked == true) { NPH.Width_ = 3.303; NPH.Height_ = 2.051; } else if (Xtended.IsChecked == true) { NPH.Width_ = 4.3; NPH.Height_ = 2.125; } else { NPH.Width_ = 3.88; NPH.Height_ = 2.63; } } else if(Custom_sizes.IsChecked==true) { NPH.Width_ = double.Parse(Width_Value.Text); NPH.Height_ = double.Parse(Height_Value.Text); } } // 点击完成按钮的事件 private void ConfirmBtn_Click(object sender, RoutedEventArgs e) { // 调用尺寸校验方法 SizeChecker(); // 直接用传入的主窗口实例调用方法,不要新建MainWindow _mainWindow.GetNewFileData(NPH.Width_, NPH.Height_); // 关闭对话框 this.Close(); }
内容的提问来源于stack exchange,提问作者Ebenezer Tena
相关产品推荐
相关产品推荐

