WPF 动态 GUI 元素

标签 wpf user-interface dynamic

在 WinForms 中,在运行时将面板换成其他面板相对容易。在 WPF 中,这似乎相当复杂(尤其是来自 XAML)。

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

非常感谢。

最佳答案

这可以在 XAML 中使用数据模板和/或触发器来解决。例如,如果您的向导中的每个页面在底层模型中表示为一个单独的类或对象,您可以使用以下两个选项之一...两者都使用 ContentControl,这是内容何时变化的完美控制同一数据的不同 View 之间的差异很大。

请注意,绑定(bind)旨在作为伪代码示例,只是为了传达意图!

基于数据模板 ,为每个页面使用不同的类:

<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>

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

关于WPF 动态 GUI 元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2382704/

相关文章:

android - 在 RatingBar 中禁用阴影

c++ - 带有 QPushButton、QComboBox QCheckbox 的动态小部件列表

c# - 如何使用表达式树对数字类型应用隐式转换?

wpf - WPF 中的表单验证

c# - 全局停用 FocusVisualStyle

c# - 在它的 "taking a screenshot"之前等待 UI 重绘

c# - 如何以编程方式设置 WPF DataGrid 的模板和填充内容?

java - JLayeredPane 不更新 JLabel 的移动

java - Android 中使用 SharedPreferences 的动态列表

ruby - 在方法定义之外定义实例变量 (ruby)