Как загрузить страницу во фрейм, который находится в окне, начиная с другой страницы wpf? - PullRequest
0 голосов
/ 29 января 2019

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

private void BtnEditarContato_Click(object sender, RoutedEventArgs e)
{
            try
            {
                Contato c = new Contato();
                c = (Contato)DgContato.SelectedItem;

                Page_Contato_Fisica p = new Page_Contato_Fisica(true, c);

                ViewContatoFisico v = new ViewContatoFisico();

                v.FrameContatoFisico.Content = p;
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
}

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

Кто-нибудь знает, как решить эту проблему?

Ответы [ 2 ]

0 голосов
/ 29 января 2019

Когда вы говорите "передать этот класс в другое окно".Если это окно уже открыто, вам нужно найти ссылку на него.Затем вы обнаружите, что его элементы управления являются частными, поэтому вы не можете просто установить содержимое фрейма.Плохо было бы использовать рамку вообще, но я расскажу об этом в последнюю очередь.Добавьте к вашему представлению публичный метод, который должен принять страницу в качестве параметра.Затем этот метод является частью вашего ViewContatoFisico и может вносить изменения в его элементы управления.

    public void SetContent(Page p)
    {
        this.FrameContatoFisico.Content = p;
    }

Затем вам нужно иметь ViewContatoFisico, чтобы что-либо делать.Вы можете либо создать новый файл и показать его:

            Page_Contato_Fisica p = new Page_Contato_Fisica(true, c);
            ViewContatoFisico v = new ViewContatoFisico();
            v.SetContent(p);
            v.Show();

В этом случае (если вы не будете осторожны), возможно, ваш пользователь получит множество открытых.Я видел приложения, в которых пользователь часто «теряет» окна, потому что все загружает другое окно.

Если у вас уже есть одно, которое вы показывали, или вы хотите избежать проблем с множеством окон, вы можете получить ссылку на любой экземпляр.это открыто вместоВы можете передать typeof (ViewContatoFisico) на:

    private Window GetWindowInstance(Type winType)
    {
        Window win;
        win = Application.Current.Windows
               .OfType<Window>()
               .SingleOrDefault(w => w.GetType() == winType);
        if (win == null)
        {
            win = (Window)Activator.CreateInstance(winType);
        }
        return win;
    }

Тогда, конечно.

            v.SetContent(p);
            v.Show();

Мой последний совет.Не используйте страницы и рамки.Вместо этого используйте UserControl и ContentControl.UserControls почти такие же, как Pages, но более гибкие.ContentControls намного легче, чем фреймы, и более гибок.У фрейма есть свой журнал, в котором содержится ссылка на каждый контент, который вы в него вставляете.

Я также рекомендую вам заглянуть в MVVM и сначала перейти в viewmodel.

0 голосов
/ 29 января 2019

Вам нужно сделать что-то вроде .show () .

Если Page_Contato_Fisica - это какая-то форма, чем:

Page_Contato_Fisica p = new Page_Contato_Fisica(true, c);
p.show();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...