如何通过添加新按钮在不同的WPF UserControls中重用菜单和工具栏?

时间:2012-02-16 01:33:27

标签: wpf grid controltemplate

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

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

问题:

  • 为了避免继承,我的usercontrol最好的 WPF 类结构是什么?

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

  • 还有其他想法吗?

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

1 个答案:

答案 0 :(得分:2)

在WPF中,Toolbar是一个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&lt; MyToolBarItem&gt;,其中MyToolbarItem是一个表示一个工具栏项的viewmodel。

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

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

如果其中一些听起来很难,你可以阅读一些MVVM。这是使WPF很棒的设计模式。