Идея графического интерфейса для WPF, хотя и не знаю, как ее реализовать

#c# #wpf #user-interface

#c# #wpf #пользовательский интерфейс

Вопрос:

У меня есть в основном два класса Plugin и PluginLauncher

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

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

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

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

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

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

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

Простые навыки MSPaint того, что я имел в виду

Комментарии:

1. Поскольку я только что изучил WPF, я рекомендую вам сначала изучить больше WPF. WPF ОЧЕНЬ сложно изучать по частям. Начните с просмотра stackpanel.

2. Просто чтобы уточнить, ваш вопрос: «Как мне создать этот графический интерфейс в WPF»?

3. @KirkBroadhurst нет, не совсем, просто нужны указания, какие объекты мне нужны, я не ищу готовое решение.

Ответ №1:

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

Комментарии:

1. Я пойду посмотрю, как я могу заставить это работать 🙂 Спасибо за предупреждение.

2. Кажется, мне нужно многому научиться, прежде чем я смогу полностью реализовать эти функции. Я понимаю, как это работает, взглянув на MVVM, я также получил несколько руководств. Я также получил результаты, но они были довольно статичными. Я пока оставлю все как есть и просто сосредоточусь на самом коде без графического интерфейса и поработаю над этим позже, когда я выполню еще кое-какую работу, связанную с WPF. Спасибо @KentBoogaart

Ответ №2:

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