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