4

我想完成一系列组成完整测试的步骤。其中一些步骤是自动的(因此信息丰富),而其他步骤则需要用户交互。测试步骤在编译时是未知的,它们使用 MEF 来加载。

目前我有类似的东西

public abstract class TestRunnerBase
{
    public abstract void Run();
}

使用如下步骤列表:

 List<TestRunnerBase> Steps = new List<TestRunnerBase>();

因此,所有代表测试可序列化的数据到目前为止都可以正常工作。然而,我真正需要的是用户从 XML 加载测试,然后引导他们完成在屏幕上显示信息并收集结果的选项。

但是试图弄清楚如何为编译时未知的数据创建控件最终让我有点卡在最好的方法上。

我正在考虑这样做,我将有一个自定义控件列表(一个步骤),并且 GUI 将显示第一步,等待该控件完成(我在这里认为引发的事件可能有效?)然后如果可用,则显示下一个,依此类推,直到测试完成。

那么在WPF中可以做到这一点吗?您可以在 WPF 中创建一个控件堆栈,每个控件都可以向父容器引发相同的事件,还是有更好的方法来做到这一点?

但是,如果我也使用抽象类,我当然不能从它派生控件,因为在 C# 中也没有多重继承。

4

2 回答 2

2

我将使用 MVVM 并创建一个视图模型,该模型了解如何导航步骤列表,提供向导类型结构(上一个/下一个)并公开当前步骤。

我假设虽然您有不同类型的潜在未知步骤,但您有一组具体的输入选项(bool、文本、日期、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)。

于 2013-01-29T16:42:02.690 回答
1

在 WPF 中,您可以使用 XAML 动态创建控件。只需使用所需的布局创建一个 XAML 片段(以编程方式或手动),然后使用XamlReader.Parse从该片段创建整个树。然后可以将返回的对象插入窗口的可视树中的某个位置。

要从 XamlReader 生成的可视化树中生成事件,您可以使用路由事件

于 2013-01-29T16:32:21.183 回答