【问题标题】:WPF accessing variables outside of Mainwindow classWPF 访问 Mainwindow 类之外的变量
【发布时间】:2021-09-17 07:26:21
【问题描述】:

我已经获得了获取用户输入(电子邮件和密码)的代码,并且我已将其转移到我的主 WPF 表单中,现在我正在尝试从另一个类访问这些变量,并且正在努力做到这一点,非常感谢任何帮助。

这是变量所在的位置:

public partial class MainWindow : Window
{
    
    public MainWindow(string clientEmail, string clientPass)
    {
        InitializeComponent();

        string email = clientEmail;
        string password = clientPass;
        
        
    }

这是我希望能够访问代码的地方

public class emailSender
{
    
    
    

    virtual public bool sendEmail(string recEmail, string usrSubject, string usrBody)
    {
        
        try
        {
            var smtpClient = new SmtpClient("smtp.gmail.com")
            {
                Port = 587,
                Credentials = new NetworkCredential(email, password),
                EnableSsl = true,

            };

            smtpClient.Send(email, recEmail, usrSubject, usrBody);
            MessageBox.Show("Email Successfully sent");
            
            return true;
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.ToString());
            return false;
        }




    }
}

【问题讨论】:

  • WPF 应用程序与 MVVM 模式配合使用效果最佳。如果您不知道它是什么,请尝试查找 [一些信息](www.c-sharpcorner.com/UploadFile/raj1979/simple-mvvm-pattern-in-wpf/)。您需要重新排列代码,并将 emailsender 类转换为 ViewModel。然后你就可以运行命令,监听属性变化,做几乎所有你想做的关于 GUI 和代码隐藏之间的通信的事情。

标签: c# wpf


【解决方案1】:

您可以这样做的一种方法是使用应用程序设置来存储全局变量。

第 1 步:在 Visual Studio 中转到“项目\[应用名称] 属性”。

第 2 步:创建 2 个设置并将它们命名为 clientEmail 和 clientPass。 确保它们设置为用户范围并且是字符串类型。

第 3 步:写入新创建的设置:

public partial class MainWindow : Window
{
    string UserEmail = "Test@gmail.com";
    string UserPassword = "12345";

    public MainWindow()
    {
        InitializeComponent();
        Properties.Settings.Default.clientEmail = UserEmail;
        Properties.Settings.Default.clientPass = UserPassword;
    }

}   

第 4 步:读取新创建的属性:

 string email = Properties.Settings.Default.clientEmail;
 string password = Properties.Settings.Default.clientPass; 

第 5 步:如果您希望保存设置:

Properties.Settings.Default.Save();   

【讨论】:

    【解决方案2】:

    首先,您应该考虑是否需要将变量传输到 MainWindow。看起来你在那里不需要它们。接下来是查看您从哪里调用 sendEmail。您可以访问那里的变量吗?您可以将它们添加到 sendEmail 的方法调用中:

    virtual public bool sendEmail(string recEmail, string usrSubject, string usrBody, string clientEmail, string clientPass)
    {
        // email sending code
    }
    

    如果你真的想将它们放在 MainWindow 中,你必须将它们存储为公共变量:

    public partial class MainWindow : Window
    {
        public string email;
        public string password;
        
        public MainWindow(string clientEmail, string clientPass)
        {
            InitializeComponent();
    
            email = clientEmail;
            password = clientPass;
            
            
        }
    ...
    }
    

    现在你可以这样做了:

    public class emailSender
    {
        // we need a reference to the main window
        private MainWindow mainWindow;
    
        public emailSender(MainWindow mainWindow)
        {
            // add mainWindow reference while constructing the email sender
            this.mainWindow = mainWindow;
        }
        
        virtual public bool sendEmail(string recEmail, string usrSubject, string usrBody)
        {
            var smtpClient = new SmtpClient("smtp.gmail.com")
            {
                Port = 587,
                // now we can access the variables of mainWindow
                Credentials = new NetworkCredential(mainWindow.email, mainWindow.password),
                EnableSsl = true,
    
            };
            // do the email sending code
            
        }
    }
    

    还有很多更好的方法可以做到这一点。要使用它们,您必须考虑变量应该存储在哪里以及哪些类需要访问它们。

    【讨论】:

    • 但是现在当我创建一个新的 obj 时我得到一个错误,因为没有参数我给出什么参数: var simpleEmail = new emailSender(); simpleEmail.sendEmail(收件人、主题、正文);
    • 缺少的参数是对您的 MainWindow 的引用。我看不到你在哪里打这些电话。您可能应该重组您的应用程序。
    猜你喜欢
    • 1970-01-01
    • 2019-05-11
    • 2021-07-23
    • 2019-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多