首页 > 解决方案 > 如何在表单和页面之间传递变量

问题描述

在我的项目 (WPF) 中有一个表单(其中声明了一个对象),其中包含一个框架,该框架根据单击的按钮显示不同的页面。在一个页面中,我拖动一个文件并获得路径。如何将路径返回到主窗体,以便可以将其“发送”到对象?(然后将由表单中的其他功能使用)

主窗体的(部分)代码

    CSV csv = new CSV();
    public MainWindow()
    {
        InitializeComponent();
        Main.Content = new LoadCSVPage();
    }
    public MainWindow(string path)
    {
        InitializeComponent();
        csv.SetLocation(path);
    }

LoadCSV 页面代码

public LoadCSVPage()
    {
        InitializeComponent();
    }
    private void LoadCSV_DragEnter(object sender, DragEventArgs e)
    {
        string filePath = "";
        string[] files = (string[])e.Data.GetData(DataFormats.FileDrop);
        foreach (string file in files)
        {
            filePath = file;
        }
        MainWindow main = new MainWindow(filePath);
        main.Show();
    }

我明白缺少了什么!将变量传递给主构造函数后,我没有显示它(通过 main.show)。现在我已经插入了它,它并不能说服我。有更清洁的方法吗?哦不,有问题。使用 main.show 创建了一个附加窗口!

标签: c#wpf

解决方案


我开始说有很多方法可以实现你想要的。我看到的第一个问题(即使您没有发布项目的 XAML 部分)是您显示 MainWindow 两次:第一次显示时,第二次在页面内拖动文件时。

一个想法可能是将 Csv 对象传递给页面:

public CSV csv = new CSV();
public MainWindow()
{
    InitializeComponent();
    Main.Content = new LoadCSVPage(csv);
}

public partial class LoadCSVPage: Page
{
    private CSV _csv;

    public LoadCSVPage(CSV mainCsv)
    {
        InitializeComponent();
        _csv = mainCsv;
    }
    private void LoadCSV_DragEnter(object sender, DragEventArgs e)
    {
        string filePath = "";
        string[] files = (string[])e.Data.GetData(DataFormats.FileDrop);
        //foreach (string file in files)
        //{
            //This also is not really clear: what happen if you drag more then one file? 
            //This way you are cycling for each file, but you are selecting the last` 
            //filePath = file;
        //}
       if(files.Length > 0)
       {
           filePath = files.Last();
       }
       // Here the csv object can obtain the filePath
       _csv.SetLocation(filePath);

    }
}

然后你可以直接从页面的方法中传递路径。


推荐阅读