Как лучше показать модальную форму с размытым фоном? - PullRequest
0 голосов
/ 22 февраля 2019

enter image description here

Как вы можете видеть на изображении выше модальной формы с размытым фоном и вот как я это делаю.
У меня есть две формы, и яоткрывая их одновременно.

private DimBackground dim;
private Modal modal;

private void ListEmployee_CellClick(object sender, DataGridViewCellEventArgs e)
{          
    if (e.RowIndex >= 0)
    {
        var row = employee.ListEmployee.Rows[e.RowIndex];
        Employee emp = new Employee().Get(row.Cells["Employee_ID"].Value.ToString());
        dim = new DimBackground();
        dim.Show();
        modal = new Modal(emp,dim);
        modal.ShowDialog();
    }     
}

Для меня это не очень хороший подход.В этом есть проблема

  • При одновременном закрытии этих двух форм теряется фокус на основной форме

Чтобы это исправить, я закрываю модальную форму искрыть тусклую форму

  • Alt F4 закрытия, вам нужно использовать эти два раза, чтобы закрыть две формы

Когда я попытался отключить формузакрытие, форма заморозилась

Как мне добиться этого лучше / чище?

1 Ответ

0 голосов
/ 22 февраля 2019

Возможные модификации, применимые к вашим затемненным оверлеям и модальным формам:

  1. Измените конструктор наложения, чтобы вы могли передать экземпляр диалогового окна режима.
  2. Сделайте так, чтобы вызывающая сторона формировала владельца наложения (с [DimBackground].Show(this);), чтобы наложение могло использовать объект-владелец для адаптации к его размерам.
  3. Оверлей подписывается на событие FormClosed экземпляра полученной модальной формы.
  4. Измените конструктор модальной формы, чтобы он мог принимать объект класса, используемый для отображения информации.
  5. Когда Модальная Форма закрывается, и если возникает событие FormClosed, Наложение закрывает себя и активирует Форму вызывающей стороны.

Добавьте необходимые null чеки.


//Caller Form
private void ListEmployee_CellClick(object sender, DataGridViewCellEventArgs e)
{
    //(...)
    var row = employee.ListEmployee.Rows[e.RowIndex];
    Employee emp = new Employee().Get(row.Cells["Employee_ID"].Value.ToString());
    DimBackground overlay = new DimBackground(new Modal(emp));
    overlay.Show(employee);
}


public partial class DimBackground : Form
{
    Form frmDialog = null; 
    public DimBackground(Form dialog)
    {
        InitializeComponent();
        this.frmDialog = dialog;
        this.frmDialog.FormClosed += (obj, evt) => { this.Close(); };
    }

    private void DimBackground_Shown(object sender, EventArgs e) => this.frmDialog.ShowDialog();

    private void DimBackground_Load(object sender, EventArgs e)
    {
        if (this.Owner == null) return;
        this.Bounds = this.Owner.Bounds;
    }

    private void DimBackground_FormClosed(object sender, FormClosedEventArgs e)
    {
        this.Owner?.Activate();
    }
}

public partial class Modal : Form
{
    public Modal() : this(null) { }
    public Modal(Employee employee)
    {
        InitializeComponent();
        // Do something with the employee object
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...