Как передать переменные между формами и страницами - PullRequest
0 голосов
/ 30 августа 2018

В моем проекте (WPF) есть форма (в которой объявляется объект), которая включает в себя рамку, которая показывает разные страницы в зависимости от нажатой кнопки. На странице я перетаскиваю файл и получаю путь. Как я могу вернуть путь к главной форме, чтобы я мог «отправить» его к объекту? (Которые затем будут использоваться другими функциями в форме)

(Частичный) код основной формы

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

Код страницы загрузки CSV

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 создается дополнительное окно!

1 Ответ

0 голосов
/ 30 августа 2018

Я начинаю говорить, что есть много способов достичь того, чего вы хотите. Первая проблема, которую я вижу (даже если вы не опубликовали 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);

    }
}

И тогда вы можете передать путь прямо из метода страницы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...