在1个基本类和2个WPF窗口之间传递数据

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在1个基本类和2个WPF窗口之间传递数据相关的知识,希望对你有一定的参考价值。

首先,我是C#和.NET开发的新手。我当时正在开发一个控制台应用程序,并决定使用WPF切换到图形化。控制台应用程序一切正常,但我现在遇到了麻烦。所以基本上,我有这个窗口:

Window 1

当我单击“添加任务”按钮时,将打开以下新窗口:Window 2。我要执行一系列的保存任务(使该应用程序可以复制目录,并在用户希望的情况下最终对其进行加密),为此,我将所有复制参数保存在字符串列表的第三部分中类,其中有一种方法可以运行它们并执行副本。

[我想做的是在数据网格中显示用户在Window1中输入的所有信息,选择我要执行的保存任务,然后单击“启动保存”按钮时调用要复制的方法,但是我可以不知道怎么做。我无法从Window1中使用Window2检索存储在第三类列表中的数据,似乎我无法一次将多个保存参数存储在我创建的列表中。 Tbh idk该怎么办,我一直在寻找几个小时的方法,但是我没有找到任何线索。我非常确定我的编码方式是错误的,并且我缺少一些重要的逻辑/推理(或者只是缺乏知识的idk),所以这就是我来这里寻求帮助的原因。

这是window1的代码:

public partial class NewSave : Window

    SeqSave sqSv1 = new SeqSave();

    public NewSave()
    
        InitializeComponent();
        List<SeqSave> caracSave = new List<SeqSave>();

        if (sqSv1.savedNamesList.Count > 0)
        
            for (int i = 0; i < sqSv1.savedNamesList.Count; i++)
            
                caracSave.Add(new SeqSave()  SaveTaskName = sqSv1.savedNamesList[i], SourcePath = sqSv1.srcPathList[i], DestinationPath = sqSv1.dstPathList[i], SaveType = sqSv1.saveTypeList[i], Backup = sqSv1.didBackupList[i] );
            

            saveListsDisplay.ItemsSource = caracSave;
        
    

    private void BusinessSoftware(object sender, RoutedEventArgs e)
    
    

    private void AddTask(object sender, RoutedEventArgs e)
    
        AddTask aT1 = new AddTask();
        aT1.Show();
    

    private void saveListsDisplay_SelectionChanged(object sender, SelectionChangedEventArgs e)
    
    

    private void LaunchSave(object sender, RoutedEventArgs e)
    
        //for(int i = 0; i < sqSv1.savedNamesList.Count; i++)
        //
        //    Console.WriteLine(sqSv1.savedNamesList[i] + "\n"
        //        + sqSv1.srcPathList[i] + "\n"
        //        + sqSv1.dstPathList[i] + "\n"
        //        + sqSv1.saveTypeList[i] + "\n"
        //        + sqSv1.didBackupList[i]);
        //
        sqSv1.launchSave();
    

这是Window2的代码:

public partial class AddTask : Window

    List<string> listExtension = new List<string>();
    SeqSave sqSv1 = new SeqSave();

    public AddTask()
    
        InitializeComponent();
    

    private void GetSourcePath(object sender, RoutedEventArgs e)
    
        FolderBrowserDialog sourcePath = new FolderBrowserDialog();
        DialogResult result = sourcePath.ShowDialog();
        string strSourcePath = sourcePath.SelectedPath;
        sqSv1.srcPathList.Add(strSourcePath);

        DirectoryInfo dirInfo = new DirectoryInfo(strSourcePath);

        foreach (FileInfo f in dirInfo.GetFiles())
        
           if (!listExtension.Contains(f.Extension))
           
               listExtension.Add(f.Extension);
           
        

        for(int i = 0; i < listExtension.Count; i++)
        
            lstB1.Items.Add(listExtension[i]);
        
    

    private void GetDestinationPath(object sender, RoutedEventArgs e)
    
        FolderBrowserDialog destinationPath = new FolderBrowserDialog();
        DialogResult result = destinationPath.ShowDialog();
        string strDestinationPath = destinationPath.SelectedPath;
        sqSv1.dstPathList.Add(strDestinationPath);
    

    private void Encrypt(object sender, RoutedEventArgs e)
    
    

    private void Return(object sender, RoutedEventArgs e)
    
    

    private void Confirm(object sender, RoutedEventArgs e)
    
        sqSv1.savedNamesList.Add(taskNameProject.Text);

        if (RadioButton1.IsChecked == true)
        
            sqSv1.saveTypeList.Add("1");

        
        else if(RadioButton2.IsChecked == true)
        
            sqSv1.saveTypeList.Add("2");
        

        if (Checkbox1.IsChecked == true)
        
            sqSv1.didBackupList.Add(true);
        
        else
        
            sqSv1.didBackupList.Add(false);
        

        MessageBox.Show("Task successfully added.");
        this.Visibility = Visibility.Hidden;
    

答案

您需要以第二种形式创建公共属性。我将public这样添加到您的代码中。我也将对话框结果添加到两种形式。

public partial class AddTask : Window


    public List<string> ListExtension  get;  = new List<string>();
    public SeqSave SqSv1  get; = new SeqSave();

    public AddTask()
    
        InitializeComponent();
    
    private void GetSourcePath(object sender, RoutedEventArgs e)
    
        FolderBrowserDialog sourcePath = new FolderBrowserDialog();
        DialogResult result = sourcePath.ShowDialog();
        string strSourcePath = sourcePath.SelectedPath;
        SqSv1.srcPathList.Add(strSourcePath);

        DirectoryInfo dirInfo = new DirectoryInfo(strSourcePath);
        foreach (FileInfo f in dirInfo.GetFiles())
        
           if (!ListExtension.Contains(f.Extension))
           
               ListExtension.Add(f.Extension);
           
        

        for(int i = 0; i < ListExtension.Count; i++)
        
            lstB1.Items.Add(ListExtension[i]);
        
    

    private void GetDestinationPath(object sender, RoutedEventArgs e)
    
        FolderBrowserDialog destinationPath = new FolderBrowserDialog();
        DialogResult result = destinationPath.ShowDialog();
        string strDestinationPath = destinationPath.SelectedPath;
        SqSv1.dstPathList.Add(strDestinationPath);
    

    private void Encrypt(object sender, RoutedEventArgs e)
    

    
    private void Return(object sender, RoutedEventArgs e)
    

    

    private void Confirm(object sender, RoutedEventArgs e)
    
        SqSv1.savedNamesList.Add(taskNameProject.Text);

        if (RadioButton1.IsChecked == true)
        
            SqSv1.saveTypeList.Add("1");

        else if(RadioButton2.IsChecked == true)
        
            SqSv1.saveTypeList.Add("2");
        
        if (Checkbox1.IsChecked == true)
        
            SqSv1.didBackupList.Add(true);
        
        else
        
            SqSv1.didBackupList.Add(false);
        
        MessageBox.Show("Task successfully added.");
        this.Close();
        DialogResult = DialogResult.OK;
    

然后访问原始格式的内容,如下所示:

    private void AddTask(object sender, RoutedEventArgs e)
    
        AddTask aT1 = new AddTask();
        DialogResult results = aT1.ShowDialog();
        if(results == DialogResult.OK)
        
            List<string> listExt = aT1.ListExtension;
        
    

以上是关于在1个基本类和2个WPF窗口之间传递数据的主要内容,如果未能解决你的问题,请参考以下文章

WPF 将对象从窗口的用户控件传递到另一个窗口的用户控件

通过适配器在片段之间传递数据(Kotlin Android)

片段和活动之间没有传递值

Android:将片段和弹出窗口的点击事件中生成的变量传递给活动的方法

如何在 Fragment 之间传递值

如何在活动和浏览器片段之间传递值? [复制]