【问题标题】:WPF: How to implement a generic window?WPF:如何实现通用窗口?
【发布时间】:2011-02-10 18:50:17
【问题描述】:

我想在我的桌面应用程序中有一个可重用的窗口,它可能会“注入”不同的 xamls。因为我希望我所有的窗口都具有相同的外观(我有一个漂亮的标题栏和关闭按钮等)

例如,我想在其中使用一个消息框(ok/cancel/string)。我希望它用于托管表单等。

我目前有:
MyWindow.xaml/cs(是一个窗口)
MyMessageBox.xaml/cs(是一个用户控件)
MyForm.xaml/cs(是一个用户控件)

那么实现这一点的最佳方法是什么。我是否只是在 MyWindow 中放置了一个 ContentPresenter,然后以某种方式将其他 xamls “注入”到其中?我是否需要其他控件从基本窗口继承某些东西?

我只是在寻找一些关于我正在尝试做的事情的最佳方式的反馈。谢谢

【问题讨论】:

    标签: c# wpf xaml user-controls


    【解决方案1】:

    一个简单的方法是一个带有框架的窗口,然后按需将页面加载到该框架中。

    【讨论】:

    • 如果您想将此(表单?)实现为模板,则可以将 Frame 替换为 ContentPresenter。但我不会。
    【解决方案2】:

    我同意Henk Holterman's answer。我刚刚为这类 WPF 应用程序编写了一个小型“框架”。我在“内容”页面上使用接口来定义代码隐藏的通用功能;我有一个通用页面模板,我用它来给我一个标题块、关闭按钮等。

    除非您绝对需要,否则我会避免使用 WPF 进行视觉继承 - 正确处理可能相当棘手。

    【讨论】:

    • 你有那个框架贴在某个地方吗?或者你能解释一下你是如何做到的吗?
    • 看起来你已经找到了你需要的东西,但这是我的代码的核心:link
    • 感谢您发布该代码。但我正在寻找更多基于 xaml 的方法,即用户控件内的 ..blabla.. 。我认为你的代码需要你直接调用方法
    【解决方案3】:

    Catel 的 DataWindow 正是这样做的。你可以在这里找到源代码:

    DataWindow.cs

    【讨论】:

    • 即使它不是商业的,你也应该提到你是 Catel 的作者之一。
    • 这很酷,但是您在哪里定义该 DataWindow 的外观。这似乎是所有功能,因为我没有看到任何 xaml
    【解决方案4】:

    您应该认真考虑为此使用Prism(由微软开发,来自Patterns & Practices 组);它专为处理这些场景而设计,为composing UIs 提供工具。

    【讨论】:

    • 我宁愿不要将图书馆的野兽用于如此简单的事情
    • @foreyez:很公平,但让我们看看你有什么——你想要注入和组合 UI 实例。这正是 Prism 所做的。并考虑将来可能遇到的更复杂的场景;你最终会编写越来越多的代码来完成已经开发的事情。
    【解决方案5】:

    我最终从这篇文章中得到了一些提示和技巧:

    http://www.codeproject.com/KB/WPF/CustomFrames.aspx

    这正是我想要的!

    【讨论】:

      【解决方案6】:
      猜你喜欢
      • 2010-09-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-11
      • 2017-12-05
      相关资源
      最近更新 更多