You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 04:48:03