如何在不同的 WPF 用户控件中重用菜单和工具栏并添加新按钮?

发布于 2025-01-05 20:44:59 字数 555 浏览 1 评论 0原文

我正在尝试将当前的 WinForms 应用程序移植到 WPF 并需要构建 WPF 类结构的帮助。

目前在 WinForms 中,我有一个基类(带有菜单、工具栏、网格和上下文菜单)和几个继承类,它们具有不同的数据源和网格列以及附加按钮菜单、工具栏和上下文菜单。

问题:

  • 对于我的用户控件来说,避免继承的最佳 WPF 类结构是什么?

  • 我可以将 ToolBar 移动到 ResourceDictionary 中(例如 ControlTemplate)吗?
    如果按钮将在单独的资源文件中指定,如何添加新按钮或将命令绑定到现有按钮?

  • 还有其他想法吗?

由于 WPF 中的继承限制,我只看到一种避免重复菜单、工具栏等的方法 - 仅在 C# 代码中实现基类,而不使用 XAML。并且可能我也无法将 XAML 用于继承的类(不知道如何将 XAML 中的新按钮添加到基类中创建的工具栏中)

I'm trying to port current WinForms app to WPF and need help with building WPF class structure.

Currently in WinForms, I have one base class (with Menu, Toolbar, Grid and Context menu) and several inherited classes with different datasources and columns for the grid and additional buttons for menu, toolbar and context menu.

Questions:

  • What will be the best WPF class structure for my usercontrol to avoid inheritance?

  • Can I move ToolBar into ResourceDictionary (e.g. ControlTemplate)?
    How to add new buttons or to bind commands to existed buttons, if buttons will be specified in a separate resource file?

  • Any other ideas?

Due to inheritance restrictions in WPF I see only one way to avoid duplicating Menu, Toolbar, etc. - implement base class in C# code only without XAML. And likely I can't use XAML for inherited classes as well (have no idea how to add new buttons in XAML into Toolbar created in base class)

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

猥琐帝 2025-01-12 20:44:59

在 WPF 中,工具栏 是一个 ItemsControl(相同对于菜单),所以它有一个您可以将 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 是代表一个工具栏项的视图模型。

MyToolBarItem 可以是基类,有几个类继承自它。然后您可以使用 DataTemplateSelector 来使用不同的模板取决于工具栏项目的类型。

这样,所有具有工具栏的用户控件都可以使用您在字典中定义的相同模板;每个工具栏仅绑定到不同的 MyToolBarItems 集合。

如果其中一些内容听起来令人难以承受,您可以阅读一些 MVVM。正是这种设计模式使 WPF 变得伟大。

In WPF a Toolbar is an ItemsControl (same for Menu), so it has an ItemsSource property you can bind to your collection of toolbar items.

<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>

In this code, ToolbarItems is an ObservableCollection< MyToolBarItem >, where MyToolbarItem is a viewmodel that represents one toolbar item.

MyToolBarItem could be the base class, with several classes inheriting from it. Then you can use a DataTemplateSelector to use a different template depending on the type of toolbar item it is.

In this way, all your user controls that have a toolbar can use the same templates you define in your dictionary; each toolbar is just bound to a different collection of MyToolBarItems.

If some of that sounds overwhelming, you can read up on some MVVM. It is the design pattern that makes WPF great.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文