Передача данных между окнами WPF

94
02 мая 2021, 12:50

Хочу разобраться как правильно передавать данные между окнами в WPF. Есть главное окно

public partial class MainWindow : Window
{
    public SolidColorBrush colorme = Brushes.Yellow;
    public MainWindow()
    {
        InitializeComponent();
    }
    private void MenuItem_Click(object sender, RoutedEventArgs e)
    {
        DialogBox dia = new DialogBox();
        dia.mymain = this;  <== не хотелось бы делать так
        dia.ShowDialog();
       // colorme = dia.my_solid;
    }
}

Оно вызывает диалоговое окно в котором содержится вызов формы для выбора пользователем цвета.

public partial class DialogBox : Window
{
    public MainWindow mymain;
    public DialogBox()
    {
        InitializeComponent();
    }
    private void Cnange_Font_OnClick(object sender, RoutedEventArgs e)
    {
       ColorDialog colorfont = new ColorDialog();
       colorfont.FullOpen = true;
       colorfont.ShowDialog();
       var line = colorfont.Color;
       Color color = Color.FromRgb(line.R, line.G, line.B);
       SolidColorBrush solid = new SolidColorBrush(color);
       mymain.colorme = solid;
    }
}

Я насколько понимаю что нежелательно в диалоговое окно передавать ссылку на MainWindow. И есть вариант это сделать через статический класс, но у меня не получается настроить уведомления для MainWindow на произведенные изменения в статическом классе.

Полный мой код. Архив

Заранее спасибо за ответ

Answer 1

Не утверждаю, что это самый правильный вариант (понятие "правильно" вообще очень относительно), но я бы сделал так:

public partial class MainWindow : Window
{
    public SolidColorBrush ColorMe = Brushes.Yellow;
    public MainWindow()
    {
        InitializeComponent();
    }        
    private void MenuItem_Click(object sender, RoutedEventArgs e)
    {
        DialogBox dia = new DialogBox(ColorMe);
        // dia.mymain = this; // <== не хотелось бы делать так
        bool? diaRes = dia.ShowDialog();
        if (diaRes.HasValue && diaRes.Value)
        {
            ColorMe = dia.SelectedColor;
        }
    }
}
public partial class DialogBox : Window
{
    public SolidColorBrush SelectedColor { get; private set; }
    public DialogBox(SolidColorBrush initialColor)
    {
        SelectedColor = initialColor.Clone();
        InitializeComponent();
    }
    private void Cnange_Font_OnClick(object sender, RoutedEventArgs e)
    {
        using (ColorDialog colorDia = new ColorDialog())
        {
            colorDia.Color
                = System.Drawing.Color.FromArgb
                (SelectedColor.Color.A,
                SelectedColor.Color.R,
                SelectedColor.Color.G,
                SelectedColor.Color.B);
            colorDia.FullOpen = true;
            DialogResult res = colorDia.ShowDialog();
            if (res == System.Windows.Forms.DialogResult.OK)
            {
                System.Drawing.Color line = colorDia.Color;
                Color color = Color.FromRgb(line.R, line.G, line.B);
                SelectedColor = new SolidColorBrush(color);
            }
        }
    }
}

Здесь возможны вариации. Но общий принцип, думаю, понятен. Во вспомогательный диалог передаётся цвет для начального значения, сохраняется внутри в свойстве. После успешного закрытия диалога (не нажата кнопка "отмена", например) считывается новый цвет из этого же свойства.

READ ALSO
Работа с несколькими процессорами (не ядрами)

Работа с несколькими процессорами (не ядрами)

Есть какое-то большоеNet приложение-служба, которая делает очень много повторяющихся вычислений, вычисления объемные, но не суть важно

100
Сортировка рваного массива

Сортировка рваного массива

То, что у меня получилось, сортирует элементы массива в строкахМне нужно, чтобы сортировались все элементы массива

122
Upload Images , Asp.Net core

Upload Images , Asp.Net core

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

109