WPF的GUI思想,虽然不知道如何实现它

时间:2011-10-04 13:53:22

标签: c# wpf user-interface

我所得到的基本上是两个课程PluginPluginLauncher

Plugin是一个抽象类,它实现了一些函数,使类成为PluginLauncher类的插件。

PluginLauncher是一个包含一个集合(SortedDictionary)的类,包括一些帮助函数来启动,停止,重启所有或特定的插件。

它还会在初始化时加载所有插件。每个插件都可以是.exe或.dll,其类继承自Plugin。 为每个插件创建一个AppDomain,并为每个插件设置通信(通过套接字通过简单的IPC消息传递)(仍然需要实现)

我希望有一个非常非常基本的GUI实现,它只包含所有已加载插件的列表,注意插件名称,状态(可以运行,停止,停止,已经过早停止(一个枚举))和一个按钮每个插件启动,停止或重新启动它。

我知道我可以通过在GUI上放置元素并计算每个X / Y位置等来添加这个功能,但我确信WPF有一些预制的'功能'。但我对WPF很新,并且不知道从哪里开始寻找。

一个简单的说明:我被限制为.net 3.5(或更低),因此没有4.0元素。

我已经包含了一个非常简单(万岁的mspaint技能)的例子。

Simple MSPaint skills of what I had in mind

2 个答案:

答案 0 :(得分:5)

你的应用程序的插件性质与你如何实现这一点的机制没什么关系。基本上,您需要一组视图模型。该集合中的每个项目代表一个插件(但它同样可以代表客户或鸡腿)。然后,将ItemsControl绑定到此集合,并定义一个模板,以了解该项目的呈现方式。

以下是一些伪代码,可以帮助您:

public class PluginViewModel : ViewModel
{
    public string Name { get; }
    public PluginState State { get; private set; }
    public ICommand StartCommand { get; }
    public ICommand StopCommand { get; }
    public ICommand RestartCommand { get; }
}

public class PluginLauncherViewModel : ViewModel
{
    // use an ObservableCollection<PluginViewModel> to store your plugin view models
    public ICollection<PluginViewModel> Plugins { get; }
}

<ScrollViewer>
    <ItemsControl ItemsSource="{Binding Plugins}">
        <ItemsControl.ItemTemplate>
            <DataTemplate>
                 <UniformGrid Rows="1">
                     <TextBlock Text="{Binding Name}"/>
                     <TextBlock Text="{Binding Status}"/>
                     <Button Command="{Binding StartCommand}">Start</Button>
                     <Button Command="{Binding StopCommand}">Stop</Button>
                     <Button Command="{Binding RestartCommand}">Restart</Button>
                 </UniformGrid>
            </DataTemplate>
        </ItemsControl.ItemTemplate>
    </ItemsControl>
</ScrollViewer>

毫无疑问,您会遇到一些问题:

  • 外部XAML的DataContext(即上例中的ScrollViewer)必须是PluginLauncherViewModel的实例。如何连接它取决于你,并有各种选择。从简单的事情开始,比如在代码隐藏中设置它。
  • ViewModel是所有视图模型的基类。有关示例,请参阅here
  • 您对ICommand的实现应该是MVVM友好的。有关示例,请参阅here

答案 1 :(得分:0)

对于最简单的方法,您可以考虑Table元素。对于更细粒度的控件,我建议您使用Grid