Идея GUI для WPF, хотя понятия не имею, как ее реализовать - PullRequest
1 голос
/ 04 октября 2011

То, что у меня есть, это два основных класса Plugin и PluginLauncher

Плагин - это абстрактный класс, который реализует некоторые функции, чтобы сделать класс Плагином для моего класса PluginLauncher.

PluginLauncher - это класс, который содержит коллекцию (SortedDictionary), включая некоторые вспомогательные функции для запуска, остановки, перезапуска всех или определенного плагина.

Он также загружает все плагины при инициализации. Каждый плагин может быть .exe или .dll с классом, наследуемым от плагина. Домен приложений создается для каждого плагина, и для каждого плагина также устанавливается связь (через простой обмен сообщениями IPC через сокеты) (все еще необходимо реализовать)

Я хочу иметь ОЧЕНЬ, ОЧЕНЬ базовую реализацию графического интерфейса, которая просто имеет список всех загруженных плагинов, отмечая имя плагина, его состояние (которое может быть запущено, останавливается, остановлено, преждевременно остановлено (Enum)) и кнопка для запуска, остановки или перезапуска каждого плагина.

Я знаю, что могу добавить эту функциональность программно, просто поместив элементы в GUI и рассчитав каждое местоположение X / Y и т. Д., Но я уверен, что WPF имеет некоторые готовые «функциональные возможности» для этого. Но я новичок в WPF и понятия не имею, с чего начать.

Простое примечание: я ограничен .net 3.5 (или ниже), поэтому нет элементов 4.0.

Я включил очень простой (ура навыки mspaint) пример того, что я имел в виду.

Simple MSPaint skills of what I had in mind

Ответы [ 2 ]

5 голосов
/ 04 октября 2011

Плагин природы вашего приложения мало влияет на механику того, как вы этого достигнете.По сути, вам нужна коллекция моделей представлений.Каждый элемент в этой коллекции представляет собой плагин (но он может в равной степени представлять клиента или куриную ножку).Затем вы привязываете 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>

Некоторые проблемы, с которыми вы, без сомнения, столкнетесь:

  • DataContext внешнего XAML (т.е. ScrollViewer в моем примере выше) должен быть экземпляром PluginLauncherViewModel.Как вы подключите это зависит от вас, и есть различные варианты.Начните с чего-то простого, например, установив его в своем коде.
  • ViewModel - базовый класс для всех моделей представлений.См. здесь для примера.
  • Ваша реализация ICommand должна быть дружественной к MVVM.См. здесь для примера.
0 голосов
/ 04 октября 2011

Для простейшего подхода вы можете рассмотреть элемент Table . Для более тонкого контроля я бы порекомендовал вам использовать Grid .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...