Как повторно использовать меню и панель инструментов в различных пользовательских элементах управления WPF с добавлением новых кнопок? - PullRequest
0 голосов
/ 16 февраля 2012

Я пытаюсь перенести текущее WinForms приложение на WPF и мне нужна помощь в построении WPF структуры класса.

В настоящее время в WinForms у меня есть один базовый класс (с меню, панелью инструментов, сеткой и контекстным меню) и несколько унаследованных классов с различными источниками данных и столбцами для сетки и дополнительными кнопками. для меню, панели инструментов и контекстного меню.

Вопросы:

  • Какая структура класса WPF будет наилучшей для моего usercontrol, чтобы избежать наследования?

  • Можно ли переместить панель инструментов в ResourceDictionary (например, ControlTemplate )?
    Как добавить новые кнопки или связать команды с существующими кнопками, если кнопки будут указаны в отдельном файле ресурсов?

  • Есть еще идеи?

Из-за ограничений наследования в WPF Я вижу только один способ избежать дублирования Меню, Панели инструментов и т. Д. - реализовать базовый класс в коде C # без XAML . И, вероятно, я не могу использовать XAML для унаследованных классов (не знаю, как добавить новые кнопки в XAML на панель инструментов, созданную в базовом классе)

1 Ответ

2 голосов
/ 16 февраля 2012

В WPF панель инструментов является ItemsControl (то же самое для Menu ), поэтому она имеет свойство ItemsSource, которое можно привязать к своей коллекции элементов панели инструментов.

<Window.Resources>
    <DataTemplate x:Key="ItemTemplate1">
        <StackPanel>
            <TextBlock Text="{Binding Property1}"/>
        </StackPanel>
    </DataTemplate>
</Window.Resources>

<Grid x:Name="LayoutRoot" DataContext="{Binding MyViewModel}">
    <ToolBar HorizontalAlignment="Left" VerticalAlignment="Top" ItemTemplate="{DynamicResource ItemTemplate1}" ItemsSource="{Binding ToolbarItems}"/>
</Grid>

В этом коде ToolbarItems является коллекцией ObservableCollection , где MyToolbarItem является моделью представления, которая представляет один элемент панели инструментов.

MyToolBarItem может быть базовым классом, унаследованным от него несколькими классами. Затем вы можете использовать DataTemplateSelector , чтобы использовать другой шаблон в зависимости от типа элемента панели инструментов.

Таким образом, все ваши пользовательские элементы управления, имеющие панель инструментов, могут использовать те же шаблоны, которые вы определили в своем словаре; каждая панель инструментов просто связана с другой коллекцией MyToolBarItems.

Если что-то звучит ошеломляюще, вы можете прочитать о MVVM . Именно шаблон дизайна делает WPF великолепным.

...