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

WPF 如何在MainWindow类外部访问其内部定义的变量

问题核心原因

  1. 你在MainWindow构造函数中定义的email、password属于构造函数局部变量,作用域仅局限在构造函数内部,执行完成后就会被销毁,类外部无法访问。
  2. emailSender和MainWindow是独立类型,未做参数传递的情况下,emailSender默认无法获取到MainWindow的内部值。

推荐解决方法(低耦合,易维护)

第一步:修改MainWindow的变量定义

将局部变量改为类的公共属性,保证类外部可访问:

public partial class MainWindow : Window
{
    // 定义类级别的公共属性,private set保证仅能在当前类内部赋值
    public string SendEmail { get; private set; }
    public string SendPassword { get; private set; }

    public MainWindow(string clientEmail, string clientPass)
    {
        InitializeComponent();
        // 给类属性赋值
        SendEmail = clientEmail;
        SendPassword = clientPass;
    }
}

第二步:改造emailSender类,通过构造函数传入所需参数

将邮箱密码作为emailSender的初始化参数,不需要直接依赖MainWindow,降低耦合:

public class emailSender
{
    // 私有字段存储发件人信息
    private readonly string _senderEmail;
    private readonly string _senderPassword;

    // 构造函数接收发件人邮箱、密码参数
    public emailSender(string senderEmail, string senderPassword)
    {
        _senderEmail = senderEmail;
        _senderPassword = senderPassword;
    }

    virtual public bool sendEmail(string recEmail, string usrSubject, string usrBody)
    {
        try
        {
            var smtpClient = new SmtpClient("smtp.gmail.com")
            {
                Port = 587,
                Credentials = new NetworkCredential(_senderEmail, _senderPassword),
                EnableSsl = true,
            };
            smtpClient.Send(_senderEmail, recEmail, usrSubject, usrBody);
            MessageBox.Show("邮件发送成功");
            return true;
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.ToString());
            return false;
        }
    }
}

第三步:MainWindow中调用示例

在需要发邮件的位置,传入MainWindow的属性初始化emailSender即可:

// MainWindow内的调用代码
var emailTool = new emailSender(this.SendEmail, this.SendPassword);
emailTool.sendEmail("接收人邮箱地址", "邮件主题", "邮件内容");

可选临时方案(高耦合,不推荐)

如果不想改造emailSender的结构,也可以直接在sendEmail方法中获取当前应用的主窗口实例读取属性,需要保证调用时MainWindow已经完成初始化:

// 在sendEmail方法中获取MainWindow属性
var mainWindow = (MainWindow)System.Windows.Application.Current.MainWindow;
// 直接读取 mainWindow.SendEmail 和 mainWindow.SendPassword 使用即可

注意事项

  • 不要明文存储密码字符串,敏感信息建议使用SecureString存储降低泄露风险
  • 不建议在业务类emailSender中调用UI控件MessageBox,建议将执行结果返回给UI层后再做弹窗提示
  • 微软官方已标记SmtpClient为过时类型,生产环境建议使用MailKit等更安全的邮件发送库

内容的提问来源于stack exchange,提问作者user14438989

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 01:27:03