Изменение содержимого окна (WPF) - PullRequest
11 голосов
/ 06 мая 2011

Я создал простое приложение WPF с двумя Windows. Пользователь заполняет некоторую информацию в первом окне и затем нажимает кнопку ОК, чтобы перевести их во второе окно. Это работает нормально, но я пытаюсь объединить обе Windows в одно окно, поэтому меняется только содержимое.

Мне удалось найти это Управление ресурсами при изменении содержимого окна , которое, похоже, то, что я ищу. Тем не менее, я ищу ContentPresenter, но не могу найти много помощи, как мне нужно его использовать. Например, если я использую ContentPresenter, куда я помещаю существующие элементы XAML, которые находятся в двух Windows? Я предполагаю, что первое Окно войдет в ContentPresenter, но второе нужно будет где-то поместить, когда его нужно будет включить.

Любая помощь будет великолепна. Простой рабочий пример был бы еще лучше.

ТИА

Ответы [ 2 ]

11 голосов
/ 06 мая 2011

A ContentPresenter обычно используется при рестайлинге существующих элементов управления.Это место, где размещается Контент элемента управления.Вместо этого вы должны использовать ContentControl, который является просто элементом управления, имеющим элемент содержимого.В качестве альтернативы, вы можете напрямую установить содержимое вашего окна.

Вы извлекаете содержимое двух ваших существующих окон в два элемента UserControls.Затем вы создаете новое окно, в котором будет размещено содержимое.В зависимости от вашей бизнес-логики вы устанавливаете содержимое этого окна (или ContentControl этого окна, если вы хотите дополнительный «основной» контент) в любой из этих двух пользовательских элементов управления.

РЕДАКТИРОВАТЬ:

Какотправная точка.Это не полный рабочий код, просто для начала.Обратите внимание, что это плохая архитектура;вам, вероятно, следует использовать MVVM или аналогичный подход, как только вы его запустите!

<Window>
    <ContentControl Name="ContentHolder" />
</Window>

<UserControl x:Class="MyFirstUserControl" /> <!-- Originally the first window -->

<UserControl x:Class="MySecondUserControl" /> <!-- Originally the second window -->

В коде позади Window:

// Somewhere, ex. in constructor
this.ContentHolder.Content = new MyFirstUserControl;

// Somewhere else, ex. in reaction to user interaction
this.ContentHolder.Content = new MySecondUserControl;
3 голосов
/ 06 мая 2011

Я использую ContentPresenter для привязки к контенту. В окне я положил что-то вроде этого:

<ContentPresenter Content="{Binding MainContent}" />

В модели представления у меня есть свойство MainContent типа object:

public object MainContent { get { return (object)GetValue(MainContentProperty); } set { SetValue(MainContentProperty, value); } }
public static readonly DependencyProperty MainContentProperty = DependencyProperty.Register("MainContent", typeof(object), typeof(SomeViewModel), new FrameworkPropertyMetadata(null));

Все, что вы установили для MainContent, будет отображаться в окне.

Чтобы сохранить разделение между представлением и моделью представления, я обычно устанавливаю свойство MainContent для другой модели представления и использую шаблон данных для сопоставления этой модели представления с представлением:

<DataTemplate DataType="{x:Type viewmodels:PlanViewModel}">
    <views:PlanView />
</DataTemplate>

Я поместил этот шаблон данных в некоторый центральный словарь ресурсов вместе со множеством других сопоставителей модель-представление-представление.

...