【问题标题】:WPF Extending WindowWPF 扩展窗口
【发布时间】:2011-01-21 20:46:01
【问题描述】:

所以我的 Windows 应用程序中有一堆 WPF Windows。 我希望每个窗口都有一个包含一个项目的上下文菜单(参见下面的代码)。但是,我不想到处复制和粘贴这段代码。我想以某种方式扩展 WPF Window 类(并将其称为 PrintableWindow )并以某种方式使每个窗口都成为 PrintableWindow 的扩展 ....这可能吗?

<Window.ContextMenu>
    <ContextMenu>
        <ContextMenu.Items>
            <MenuItem Header="Print"
                      Click="mnuPrint_Click">
            </MenuItem>
        </ContextMenu.Items>
    </ContextMenu>
</Window.ContextMenu>

【问题讨论】:

    标签: wpf inheritance window


    【解决方案1】:

    您不需要扩展窗口来完成此操作,只需为所有窗口创建一个全局样式。

    在您的 app.xaml 文件中:

    <Style TargetType="{x:Type Window}">
        <Setter Property="ContextMenu">
            <Setter.Value>
                <ContextMenu>
                    <ContextMenu.Items>
                        <MenuItem Header="Print" Command="Print" />
                    </ContextMenu.Items>
                </ContextMenu>
            </Setter.Value>
        </Setter>
    </Style>
    

    如果您想从特定窗口打印,您必须为窗口中的打印命令创建一个处理程序。更好的是,如果您使用的是视图模型,您可以绑定到您的命令。

    【讨论】:

    • 我只想补充一点,您需要为窗口样式设置 x:Key 属性并为每个窗口显式分配样式。 Window 无法通过 TargetType 自动从应用程序资源中选择样式是一个已知问题。
    【解决方案2】:

    创建您自己的Window 类,名为PrintableWindow,它派生自 Window,然后修改任何其他 Window 实例以从您的 PrintableWindowWindow 派生。这样,所有Window 实例都将属于PrintableWindow 类型,其中有您的ContextMenu 和与之关联的处理程序。

    【讨论】:

    • 这似乎几乎不可能!
    • 也不是“不可能”,但扩展 Window 类似乎非常困难。
    • 回填已经完成的代码需要进行重构,但是一旦你被“赶上”,我不确定困难在哪里?
    猜你喜欢
    • 1970-01-01
    • 2023-04-08
    • 2017-08-31
    • 1970-01-01
    • 2017-06-20
    • 2011-11-09
    • 2011-04-06
    • 2011-03-16
    • 1970-01-01
    相关资源
    最近更新 更多