Как загрузить новый пользовательский элемент управления, не открывая новое окно в WPF? - PullRequest
1 голос
/ 04 мая 2009

Я положил это приложение WPF http://tanguay.info/web/index.php?pg=codeExamples&id=164 вместе

http://tanguay.info/web/index.php?pg=codeExamples&id=164

, который читает XML-файл клиентов, позволяет пользователю редактировать их и сохраняет его обратно, , и все это хорошо работает .

Однако, когда пользователь нажимает кнопку Сохранить на странице «Управление клиентами», Я хочу, чтобы приложение «вернулось» на страницу «Показать клиентов».

«Страницы» - это пользовательские элементы управления, которые динамически загружаются в оболочку следующим образом:

using System;
using System.Collections.Generic;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Reflection;
using TestDynamicForm123.View;

namespace TestDynamicForm123
{
    public partial class Shell : Window
    {
        private Dictionary<string, IBaseView> _userControls = new Dictionary<string, IBaseView>();

        public Dictionary<string, IBaseView> GetUserControls()
        {
            return _userControls;
        }

        public Shell()
        {
            InitializeComponent();

            List<string> userControlKeys = new List<string>();
            userControlKeys.Add("WelcomeView");
            userControlKeys.Add("CustomersView");
            userControlKeys.Add("ManageCustomersView");
            Type type = this.GetType();
            Assembly assembly = type.Assembly;
            foreach (string userControlKey in userControlKeys)
            {
                string userControlFullName = String.Format("{0}.View.{1}", type.Namespace, userControlKey);
                IBaseView userControl = (IBaseView)assembly.CreateInstance(userControlFullName);
                _userControls.Add(userControlKey, userControl);
            }

            //set the default page
            btnWelcome.RaiseEvent(new RoutedEventArgs(Button.ClickEvent));
        }

        private void btnGeneral_Click(object sender, RoutedEventArgs e)
        {
            PanelMainContent.Children.Clear();
            Button button = (Button)e.OriginalSource;
            PanelMainWrapper.Header = button.Content;
            Type type = this.GetType();
            Assembly assembly = type.Assembly;

            IBaseView userControl = _userControls[button.Tag.ToString()] as IBaseView;
            userControl.SetDataContext();


            PanelMainContent.Children.Add(userControl as UserControl);
        }
    }
}

Поэтому, когда ManageCustomersView загружен и обрабатывает щелчок, я затем пытаюсь вернуться на страницу CustomersView , которая работает, но при этом открывается новое окно поэтому каждый раз, когда пользователь редактирует клиента, появляется новое окно .

private void OnSave(object sender, System.Windows.Input.ExecutedRoutedEventArgs e)
{
    Customer customer = e.Parameter as Customer;
    Customer.Save(customer);

    //go back to default back
    Shell shell = new Shell();
    Button btnCustomers = shell.FindName("btnCustomers") as Button;
    btnCustomers.RaiseEvent(new RoutedEventArgs(Button.ClickEvent));
    shell.Show();
}

Как я могу изменить вышеуказанный код внутри одного UserControl так, чтобы его parent выгружал текущий пользовательский элемент управления и загружал другой, вместо того, чтобы выскакивать другой экземпляр приложения, как сейчас?

1 Ответ

1 голос
/ 04 мая 2009

Новое окно явно появляется, потому что вы создаете новый объект Shell каждый раз, когда вызывается OnSave. Вам нужно получить родительское окно оболочки .

Shell parentShell = Window.GetWindow(this) as Shell;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...