Winforms MVP menunjukkan formulir anak mdi

Teman-teman, saya punya masalah dengan pola desain MVP karena saya tidak yakin bagaimana cara menampilkan tampilan anak dalam bentuk induk. Pandangan saya tidak memiliki properti MdiParent. Bisakah saya membuatnya secara manual di antarmuka tampilan?

Tampilan sangat jelek untuk setiap formulir terbuka di jendela baru!

Saya memiliki dua presenter:

  1. MainPresenter (mewakili logika mainForm (induk))
  2. TaskPresenter (mewakili logika untuk menyimpan, menyisipkan, menghapus logika)

Dua antarmuka Tampilan:

  1. Tampilan Utama
  2. Tampilan ITask

Dan dua winform:

  1. MainForm - mainwindow (form mdi induk)
  2. Formulir Tugas

Periksa kode:

Pembawa Acara Utama

public class MainPresenter
{
    private readonly IMainView view;

    private List<ITaskModel> tasks;

    // Constructor
    public MainPresenter(IMainView view)
    {
        this.view = view;
        this.Init();
        this.tasks = new List<ITaskModel>();
    }

    // Initialize
    private void Init()
    {
        this.view.AddTask += AddTask;
    }

    // Add task
    private void AddTask(object sender, EventArgs e)
    {
        // Show as MDI CHILD 
    }
}

IMainView

  public interface IMainView 
  {
        event EventHandler<EventArgs> AddTask;
  }

Pemberi Tugas

public class TaskPresenter 
{
    private readonly ITaskView view;
    private List<ITaskModel> tasks;

    private bool isNew = true;
    private int currentIndex = 0;

    // Constructor
    public TaskPresenter(ITaskView view)
    {
        this.view = view;
        this.Initialize();
    }

    // Initialize
    public void Initialize()
    {
        tasks = new List<ITaskModel>();

        view.SaveTask += Save;
        view.NewTask += New;
        view.PrevTask += Previous;
        view.NextTask += Next;
    }

    private void Save(object sender, EventArgs e)
    {
    }
    private void New(object sender, EventArgs e)
    {
    }     
    private void Next(object sender, EventArgs e)
    {
    }
    private void Previous(object sender, EventArgs e)
    {
    }
    private void BlankTask()
    {   
    }
    private void LoadTask(ITaskModel task)
    { 
    }
}

TaskView

public interface ITaskView
{
    String TaskName { get; set; }
    String TaskPriority { get; set; }
    DateTime? StartDate { get; set; }
    DateTime? DuoDate { get; set; }

    event EventHandler<EventArgs> SaveTask;
    event EventHandler<EventArgs> NewTask;
    event EventHandler<EventArgs> NextTask;
    event EventHandler<EventArgs> PrevTask;
}

Dan inilah MainForm

public partial class MainForm : Form, IMainView
{
    MainPresenter Presenter;

    // Construcor
    public MainForm()
    {
        InitializeComponent();
    }

    // Events
    public event EventHandler<EventArgs> AddTask;

    // On load
    private void MainForm_Load(object sender, EventArgs e)
    {
        Presenter = new MainPresenter(this);
    }

    // On click add task btn
    private void addTaskBtn_Click(object sender, EventArgs e)
    {
        if(AddTask != null)
        {
            // When is this event triggered i want to show another child form for adding new task
            AddTask(this, EventArgs.Empty); 
        }
    }
}

Jadi bagaimana saya bisa menampilkan TaskView sebagai anak di MainView? masukkan deskripsi gambar di sini


person Ivan    schedule 18.07.2016    source sumber


Jawaban (1)


Aplikasi UIA adalah Aplikasi Windows Forms tetapi tipe keluaran Perpustakaan Kelas. Tambahkan referensi MVPFramework

Formulir Utama

public partial class MainForm : Form , IMainView
{
    [Resolve]
    public IMainControl mainControl;

    public MainForm()
    {
        InitializeComponent();
    }


    public bool ShowAsDialog()
    {
        throw new NotImplementedException();
    }

    private void openChildFormToolStripMenuItem_Click(object sender, EventArgs e)
    {
        mainControl.OnOpenChildForm();
    }
}

Bentuk Anak

public partial class ChildForm : Form , IChildView
    {
        public ChildForm()
        {
            InitializeComponent();
        }

        public bool ShowAsDialog()
        {
            throw new NotImplementedException();
        }


        public object MDIparent
        {
            set
            {
                this.MdiParent = (Form)value;
            }
        }
    }

Aplikasi Inti adalah Perpustakaan kelas

Kontrol Utama

 public interface  IMainControl :IControl
  {
      void OnOpenChildForm();
  }

Kontrol Utama

public class MainControl  :IMainControl
    {
        [Resolve]
      public IApplicationController applicationController;
      public void OnOpenChildForm()
      {
       IChildControl TransfersOnTheWayControl = applicationController.Resolve<IChildControl>();
       TransfersOnTheWayControl.Run();
      }
    }

Kontrol Anak saya

 public interface IChildControl :IControl
      {
         void Run();
      }

Tampilan Utama

public interface  IMainView :IView
{

}

Tampilan Anak saya

antarmuka publik IChildView :IView {

      bool ShowAsDialog();`enter code here`

      object MDIparent { set; }
  }

IMainPresenter

public interface  IMainPresenter :IPresenter
 {

 }

SayaAnakPresenter

public interface  IChildPresenter :IPresenter
 {
   bool Ask();
 }

Presenter Utama

public class MainPresenter :BasePresenter<IMainView>, IMainPresenter
 {

 }

Presenter Anak

public class ChildPresenter : BasePresenter<IChildView>, IChildPresenter
    {

       public bool Ask()
       {
            this.Init();
            bool res = View.ShowAsDialog();
            ApplicationController.ClearInstance<IChildView>();
            return res;
       }

        public override void Init()
        {
            View.MDIparent = ApplicationController.GetMainFrom<IMainPresenter>();
            base.Init();
        }
    }

LauncherApplication adalah Aplikasi Konsol tetapi tipe keluaran Formulir Windows.

 class Program
        {
            static void Main(string[] args)
            {
                IApplicationController applicationController = new ApplicationController(new ServicesContainerAdapter());

                applicationController


                    //RegisterView
                    .RegisterView<IMainView, MainForm>()
                    .RegisterView<IChildView, ChildForm>()


                    //RegisterPresenter
                    .RegisterPresenter<IMainPresenter, MainPresenter>()
                    .RegisterPresenter<IChildPresenter, ChildPresenter>()


                    //RegisterController
                    .RegisterController<IMainControl, MainControl>()
                    .RegisterController<IChildControl, ChildControl>();



                IMainPresenter mainPresenter = applicationController.Resolve<IMainPresenter>();
                mainPresenter.Init();

                Application.Run((Form)mainPresenter.FormObject);
            }
       }
person Mahmud Büşra Yahyayev    schedule 25.05.2017
comment
dapatkah Anda memposting kode sumber BasePresenter dan IPresenter, IView? Juga MVPFramework mana yang Anda referensikan? - person Tom De Bie; 12.03.2020