WPF动态GUI元素

Dun*_*can 4 wpf user-interface dynamic

在WinForms中,在运行时为其他面板交换面板相对容易.在WPF中,这似乎相当复杂(特别是来自XAML).

任何人都可以提供关于在运行时交换gui元素的"最佳实践"方式的明确指导(在向导类型情况下考虑页面).

非常感谢.

Dan*_*zey 5

这可以使用datatemplates和/或触发器在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>
Run Code Online (Sandbox Code Playgroud)

或者基于触发器,使用指示当前页面的属性:

<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>
Run Code Online (Sandbox Code Playgroud)

这两个选项只会根据需要加载每个页面的控件,因此您不会在窗口中"加载但隐藏"所有控件.