Получить данные от окна

192
30 октября 2017, 20:39

Возникла необходимость создавать окно для ввода названия файла который позже будет создан. Создать окно несложно, но как от этого окна вернуть данные я не могу придумать. Есть ли способ определить произошло ли событие Click()? Или подскажите более грамотные или разумные способы. Буду рад даже направлению в котором искать.

Код создаваемого окна:

class InputBox : Window
{   
    //private static  InputBoxDialog;
    private static TextBox textBox;
    private static Button button;
    private static Label label;
    private static Window NewWindow;
    private static Window CurrentWindow;
    private static string TextVar;
    public InputBox()
    {
    }
    public InputBox(ref Window textVar)
    {
    }
    public void Show(string labelContent)
    {
        CreateBox(labelContent);
    }
    public void Show(string labelContent, string titleContent)
    {
        CreateBox(labelContent, titleContent);
    }
    public void Show(string labelContent, string titleContent, string buttonContent)
    {
        CreateBox(labelContent, titleContent, buttonContent);
    }
    private void CreateBox(string labelContent, string titleContent = "Input Box", string buttonContent = "Enter")
    {
        NewWindow = new Window();
        NewWindow.Name = "NewWindow";
        NewWindow.Title = titleContent;
        NewWindow.Width = 300;
        NewWindow.Height = 200;
        var stackPanel = new StackPanel { Orientation = Orientation.Vertical };
        label = new Label { Content = labelContent, Name = "NewWindowLabel" };
        textBox = new TextBox { Text = "", Name = "NewWindowTextBox" };
        button = new Button { Content = buttonContent, Name = "NewWindowButton" };
        button.Click += NewWindowButton_Click;
        stackPanel.Children.Add(label);
        stackPanel.Children.Add(textBox);
        stackPanel.Children.Add(button);
        NewWindow.Content = stackPanel;
        NewWindow.Show();
    }
    private void NewWindowButton_Click(object sender, RoutedEventArgs e)
    {
        TextVar = textBox.Text;
        NewWindow.Close();
    }
}

Вызов этого окна:

public void GetFileName()
{
    var InputBoxMsg = "Enter you file name";
    InputBox inputBox = new InputBox();
    inputBox.Show(InputBoxMsg);
}
Answer 1

Судя по описанию вопроса вам нужно диалоговое окно, следовательно вам нужно его отображать как диалог

NewWindow.Content = stackPanel;
NewWindow.ShowDialog();

А дальше вы уже сохраняете информацию в приватное поле TextVar.

private static string TextVar;

значит остается только изменить его на публичное свойство, которое и будет отвечать за возвращение результата или если все сделать в одном методе.

Я немного изменил ваш код - убрал избыточные методы Show - при наличии параметров по умолчанию при вызове можно указывать только обязательные параметры а также все или часть из тех, для которых определены стандартные значения. Кроме этого убрал конструкторы, так как в данном случае они не нужны.

public class InputBox
{
    public static string Show(string labelContent, string titleContent = "Input Box", string buttonContent = "Enter")
    {
        var NewWindow = new Window();
        NewWindow.Name = "NewWindow";
        NewWindow.Title = titleContent;
        NewWindow.Width = 300;
        NewWindow.Height = 200;
        var textVar = "";
        var stackPanel = new StackPanel { Orientation = Orientation.Vertical };
        var label = new Label { Content = labelContent, Name = "NewWindowLabel" };
        var textBox = new TextBox { Text = "", Name = "NewWindowTextBox" };
        var button = new Button { Content = buttonContent, Name = "NewWindowButton" };
        button.Click += (s, e) => {
            textVar = textBox.Text;
            NewWindow.Close();
        }
        stackPanel.Children.Add(label);
        stackPanel.Children.Add(textBox);
        stackPanel.Children.Add(button);
        NewWindow.Content = stackPanel;
        NewWindow.ShowDialog();
        return textVar;
     }
}

и тогда вызов будет следующим

public string GetFileName()
{
    var InputBoxMsg = "Enter you file name";
    return InputBox.Show(InputBoxMsg);
}

Но это по-прежнему WinForms подходят, WPF способ - определить специальную VM, в которой хранилась бы информация о указанном файле.

READ ALSO
Правильная реализация в программе MemoryCache

Правильная реализация в программе MemoryCache

Создаю приложение WinFormsВ главном классе Form1 имею объект MemoryCache cache

236
Зачем return после редиректа?

Зачем return после редиректа?

Есть система авторизацииВот её основная часть:

269
нужно каждый час запускать Electron АПКУ на windows

нужно каждый час запускать Electron АПКУ на windows

всем привет! ситуация следующая - мне нужно каждый час запускать exe-файл или скрипт mainjs в виндовс 7,8,10

196
Клик по ссылке с помощью PhantomJS

Клик по ссылке с помощью PhantomJS

Используя phantomjs получаю страничкуКак сделать клик по элементу

323