从 XML 动态创建 WPF 控件并将它们堆叠
本文关键字:控件 XML 动态 创建 WPF | 更新日期: 2023-09-27 17:56:36
我想通过一系列构成完整测试的步骤。其中一些步骤是自动的(因此是信息性的),而其他步骤则需要用户交互。测试步骤在编译时是未知的,它们正在使用 MEF 进行加载。
目前我有类似的东西
public abstract class TestRunnerBase
{
public abstract void Run();
}
使用如下所示的步骤列表:
List<TestRunnerBase> Steps = new List<TestRunnerBase>();
因此,所有表示可序列化测试的数据,到目前为止工作正常。 但是,我真正需要的是用户从XML加载测试,然后引导他们完成在屏幕上显示信息并收集结果的选项。
但是试图弄清楚如何为编译时未知的数据创建一个控件,最终让我有点卡在最佳方法上。
我正在考虑这样做,我会有一个自定义控件列表(1 个步骤),GUI 将显示第一步,等待该控件完成(我在这里想引发的事件可能会起作用?)然后显示下一个如果可用,依此类推,直到测试完成。
那么是否可以在 WPF 中执行此操作?是否可以在 WPF 中创建控件堆栈,每个控件都可以将相同的事件引发到父容器,或者是否有更好的方法来执行此操作?
但是,如果我也使用抽象类,我就不能从中派生控件,当然,在 C# 中也没有多重继承。
我将使用 MVVM 并创建一个视图模型,该模型了解如何导航步骤列表,提供向导类型结构(上一个/下一个)并公开当前步骤。
我假设当你有不同类型的潜在未知步骤时,你有一组具体的输入选项(布尔值、文本、日期、int 等),那么你可以在 TestRunnerBase 上使用一个抽象属性,该属性使用必须覆盖的枚举来识别需要(或没有)什么样的输入。
然后,您可以使用数据模板和/或数据触发器来控制测试的每个步骤显示的内容。主视图模型可以检查条件是否适合进行下一步(可能是测试的验证)。
一些伪代码让你思考:
public enum TestInput
{
None,
Bool,
Text
}
public abstract class TestRunnerBase
{
public abstract TestInput TestInput { get; }
public bool BoolInput { get; set; }
public string TextInput { get; set; }
public abstract bool CanRun()
public abstract void Run();
}
public class MainViewModel
{
List<TestRunnerBase> Steps = new List<TestRunnerBase>();
public TestRunnerBase CurrentStep {get;set;};
public MainViewModel()
{
//loads the Steps
CurrentStep = Steps
}
public Command RunStepCommand
{
if (CurrentStep.CanRun())
{
CurrentStep.Run();
CurrentStep = Steps.Next(); //you get the idea
}
}
}
对于 XAML,你将 ContentPresenter 绑定到 CurrentStep,并使用数据模板(可能还有数据触发器)来控制对用户可见的内容(当然还有绑定到 UI)。
在 WPF 中,可以使用 XAML 动态创建控件。只需使用所需的布局(以编程方式或手动方式)创建 XAML 代码段,然后使用 XamlReader.Parse 从该代码段创建整个树。然后,可以将返回的对象插入窗口的可视化树中的某个位置。
若要从 XamlReader 生成的可视化树生成事件,可以使用路由事件。