WPF Dynamic GUI элементы - PullRequest
       2

WPF Dynamic GUI элементы

4 голосов
/ 05 марта 2010

В WinForms было относительно легко поменять панели во время выполнения для других панелей. В WPF это кажется более сложным (особенно из XAML).

Может ли кто-нибудь дать четкое руководство о том, как "обменяться" элементами графического интерфейса во время выполнения (подумайте о страницах в ситуации типа мастера).

Большое спасибо.

Ответы [ 5 ]

5 голосов
/ 05 марта 2010

К этому можно обратиться в XAML с использованием шаблонов данных и / или триггеров. Например, если каждая страница в вашем мастере была представлена ​​в базовой модели как отдельный класс или объект, вы можете использовать один из следующих двух вариантов ... Оба используют ContentControl, который является идеальным элементом управления, когда содержимое будет меняться в значительной степени между различными представлениями одних и тех же данных.

Обратите внимание, что привязки предназначены в качестве примеров псевдокода, просто чтобы передать намерение!

На основе DataTemplate , с использованием разных классов для каждой страницы:

<Grid>
  <Grid.Resources>
     <DataTemplate DataType="{x:Type WizardPageOne}">
        <!-- page 1 layout here -->
     </DataTemplate>
     <DataTemplate DataType="{x:Type WizardPageTwo}">
        <!-- page 2 layout here -->
     </DataTemplate>
     <!-- ... etc -->
  </Grid.Resources>

  <ContentControl Content="{Binding CurrentPageModel, Source=Wizardmodel}" />
</Grid>

Или На основе триггера , используя свойство, указывающее текущую страницу:

<ContentControl Content="{Binding WizardModel}">
    <ContentControl.Style>
       <Style>
           <Style.Triggers>
               <DataTrigger Binding="{Binding CurrentPageIndex} Value="1">
                  <Setter Property="Template">
                      <Setter.Value>
                         <ControlTemplate>
                             <!-- page 1 layout here -->
                         </ControlTemplate>
                      </Setter.Value>
                  </Setter>
               </DataTrigger>
               <DataTrigger Binding="{Binding CurrentPageIndex} Value="2">
                  <Setter Property="Template">
                      <Setter.Value>
                         <ControlTemplate>
                             <!-- page 2 layout here -->
                         </ControlTemplate>
                      </Setter.Value>
                  </Setter>
               </DataTrigger>
               <!-- .... etc -->
           </Style.Triggers>
       </Style>
    </ContentControl.Style>
</ContentControl>

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

1 голос
/ 05 марта 2010

Основные понятия WinFomrs и WPF различны. В WPF не рекомендуется играть с UIElements (элементами управления) напрямую. Используйте DataBinding / DataContexts и просто работайте с данными, и тогда пользовательский интерфейс будет функционировать соответствующим образом. Эта концепция полностью посвящена шаблону WPF MVVM. Вы можете посмотреть некоторые примеры MVVM и попробовать их, прежде чем выполнять более сложные проекты WPF.

Простой пример. Предположим, вам необходимо динамически отображать несколько элементов в ListBox. Типичный способ winform - создать элементы и добавить их непосредственно в ListBox. Но в WPF вы создаете ObservableCollection<Customer> и привязываете его к ListBox.ItemsSource. затем определите DataTemplate для типа данных клиента, чтобы система WPF понимала, как в приложении отображается коллекция клиентов. Поэтому, когда вы добавляете новый экземпляр клиента в коллекцию, ваш ListBox волшебным образом обновляется еще одним элементом. Кажется довольно прямым и очень слабо связанным способом Data and View, верно? Наилучшие пожелания по изучению WPF. -

http://www.bing.com/search?q=WPF+MVVM

Таким образом, основная подсказка к вашему вопросу - сделать представление соответствующим образом для данных, и когда произойдет изменение данных / свойств, WPF позаботится об изменении панелей / элементов управления. Так что это действительно проще, чем способ WinForms, когда вы подходите с точки зрения данных и представлений.

0 голосов
/ 05 марта 2010

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

0 голосов
/ 05 марта 2010

Предложения MVVM здесь все хороши. Но если вы разрабатываете ориентированный на страницы пользовательский интерфейс, который должен быть ориентирован на навигацию, вы также можете использовать Структурированная навигация .

0 голосов
/ 05 марта 2010

На ум приходит пара вариантов. Если вы создаете свои компоненты как UserControls и используете привязку данных, тогда вы сможете делать то, что вам нужно, с минимальными усилиями.

Первый вариант - загрузить каждый компонент в родительский контейнер (сетку, холст и т. Д.) С Visibility = "Collapsed", а затем показать и скрыть их по мере необходимости. Это имеет то преимущество, что вы можете сделать это декларативно в XAML.

Другой вариант - загружать компоненты по мере необходимости, например, в обработчике событий кнопки или какого-либо другого элемента пользовательского интерфейса. В этом случае вы, вероятно, захотите удалить текущий отображаемый элемент из коллекции Children вашего хост-компонента, а затем создать свой следующий элемент управления, установить DataContext (именно поэтому привязка важна) и добавить его в коллекцию Children.

( отказ от ответственности : это основано на моем опыте выполнения в основном того, о чем вы говорите в Silverlight 3.0, поэтому могут быть некоторые причуды WPF, о которых я не подозреваю).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...