【问题标题】:Can a wpf application be deployed without compiling the xaml?可以在不编译 xaml 的情况下部署 wpf 应用程序吗?
【发布时间】:2008-12-01 16:05:52
【问题描述】:

是否可以以可以在运行时操作 xaml 文件的方式部署 WPF Windows 应用程序?如果可能的话,我想这将类似于一个 asp.net 应用程序,它可以将 .aspx 页面部署为内容,然后在运行时即时编译。

我想通过编辑 XAML 来允许在运行时编辑屏幕的简单布局。有谁知道这是否可行?

编辑:当我提到 xaml 文件时,我指的是与我的 UIElement 类对应的 xaml。换句话说,我已经使用 Xaml 和代码隐藏、继承、事件处理程序、程序集引用等定义了 UserControl 类。当部署时间到来时,我希望能够保留代码隐藏功能但仍然允许 xaml待编辑。

【问题讨论】:

    标签: .net wpf xaml deployment


    【解决方案1】:

    我有另一个建议给你 - 真正的问题是:

    “我希望通过编辑 XAML 在运行时编辑屏幕的简单布局。有谁知道这是否可行?”

    答案肯定是“是”!有很多方法可以实现这一点,当然需要做一些假设。

    如果您不需要在 XAML 的“动态”部分处理事件或编写自定义值转换器(或通常会在后面的代码中包含的任何其他内容),那么您可以简单地使用 XamlReader 类来解析XAML 文件或包含 XAML 的字符串。由于您只是在编辑布局,我希望这些假设成立。

    所以,这就是我要做的:

    1) 编写所有自定义控件、数据模型、值转换器等,并将它们粘贴到程序集中。

    2) 通过让您的应用引用它或动态加载它来加载该程序集 - 两者都可以工作。

    3) 创建一个字符串/文件/资源​​(任您选择),其中包含执行布局的 XAML,并完成 .NET 命名空间到 XML 命名空间的映射。确保根元素上没有“x:Class”属性,因为您没有代码隐藏文件!该字符串将使用标准 WPF 控件(如 StackPanel)来布局您的自定义控件。 (当然你也可以写自定义布局控件)。

    4) 允许用户编辑此字符串。编辑完成后,使用 XamlReader 解析文件,然后在窗口中显示生成的 UIElement。

    宾果游戏!

    一个问题 - 每次更改 XAML 时,都会抛出 GUI 并创建一个新的。如果你的 GUI 是令人满意的(即使当前插入符号的位置很重要),用户很快就会生气。这取决于您打算使用什么 - 这可能不是问题。

    我希望通过更多的工作,您可以编写一个 MarkupExtension,用于引用您尝试布局的部分。这样它们可以在布局更改时重复使用。

    我希望这很清楚。如果没有,请告诉我,我可以扩展这个概念 - 它会成为一个不错的博客条目。

    【讨论】:

    • 这是有用的见解。我必须做一些研究以确定这是否是我需要做的。
    • 如果该方法听起来像您想要做的但无法让 WPF 表现出良好的举止,我很乐意提供进一步的帮助。如果您需要联系我,请访问 thinkbottomup.com.au 的 daniel.paull。干杯,丹。
    【解决方案2】:

    感谢 unthinkableMayhem 的参考。

    松散 XAML 的问题在于,在运行时调用 XamlReader 时,无法将事件连接到程序集中的函数,也没有动态加载程序集的机制。在 XAML 中指定路由事件的处理程序的方式是 WPF/XAML 的最大设计缺陷之一,这使得松散的 XAML 几乎毫无用处。

    我在 XAML 中嵌入动态语言运行时 (DLR) 脚本所做的工作对于松散和编译的 XAML 都很有用。我的意图是通过允许松散 XAML 中可用的路由事件、命令、值转换器和其他 XAML/WPF 概念,使松散 XAML 成为 WPF 中的一等公民。我觉得这已经实现了(虽然我的博客没有提到动态加载程序集,但这是直截了当的)。

    如果您坚持,可以部署 WPF Windows 应用程序,使 xaml 文件可以在运行时进行操作。哎呀,您可以使用嵌入式脚本动态生成 XAML - 无需组装。伙计,这是我长期以来所说的最有趣的事情之一。

    请注意 - XAML 中的“X”只是一个营销术语。从工程的角度来看,它是不可扩展的,所以当你离开微软设定的道路时,期待一个痛苦的世界。如果您这样做,我将很乐意为您提供帮助 - 我的网站 (www.thinkbottomup.com.au) 上的联系方式。

    干杯,

    丹

    【讨论】:

      【解决方案3】:

      不容易。 WPF 应用程序将其 XAML 由编译器翻译成 .g.cs 和 .baml,然后编译成二进制文件。

      当然可以创建运行时 XAML 编译器。这不是一件容易的事,而且真的需要思考一下为什么不把它作为一个网站来做!

      【讨论】:

        【解决方案4】:

        这篇博文:http://www.thinkbottomup.com.au/site/blog/Embedding_DLR_Scripts_in_XAML_Part_6 提供了一些关于在运行时加载 XAML 以及其他有趣内容的信息。

        【讨论】:

          【解决方案5】:

          看看http://xtrememvvm.codeplex.com/

          它允许您使用松散的 XAML 文件,但仍然可以连接到事件、数据绑定和路由命令。

          • 粘土

          2012 年 10 月 7 日编辑: 应罗伯特哈维的要求,我是上述框架的作者。考虑到它是开源的,我并没有试图隐藏任何东西,只是认为它不相关。无论如何,我一定会在以后的任何帖子中披露我的从属关系(如果有的话)。

          【讨论】:

          【解决方案6】:

          XAMLPad 和XAML Cruncher 都这样做,所以它一定是可能的。

          XAML Cruncher 源代码仅在 Charles Petzold 关于 WPF 的书中提供:

          http://www.charlespetzold.com/wpf/

          看起来它使用XamlReader 来解析 XAML。

          【讨论】:

            【解决方案7】:

            您可以在运行时将 XAML 加载到应用程序,如下所示。

            UIElement documentRoot = (UIElement)System.Windows.Markup.XamlReader.Load(xmlReader);
            

            有一个“松散 XAML”的概念。松散 XAML 基本上是允许您打开硬盘上的任何 XAML 文件(或网页上的超链接)并在浏览器中“运行”它而无需编译的功能.

            查看这个示例松散的 XAML 页面,它有一组我已经实现的按钮和自定义控件模板,http://wpf.ria-labs.com/ux.xaml 在这个blog 它只是在 IE 中打开。您可以将 XAML 加载到 WPF 应用程序中并可以使用。

            【讨论】:

            • FWIW,我可以使用 FF3 正常打开它。如果这很重要,我已经安装了 .NET 3.5SP1。
            • 但它并没有真正回答这个问题。 OP 明确指出这是一个 WPF 应用程序,因此 XAML 在 Web 浏览器中显示的能力完全无关紧要。
            • 我使用“Web browser”只是为了解释 LooseXAML 概念的更多特征。
            猜你喜欢
            • 2014-03-21
            • 1970-01-01
            • 2010-12-12
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2010-11-04
            • 2010-09-16
            • 2017-03-21
            相关资源
            最近更新 更多