【问题标题】:How can I programmatically add xaml elements in Visual Studio 2017?如何以编程方式在 Visual Studio 2017 中添加 xaml 元素?
【发布时间】:2018-10-18 12:40:27
【问题描述】:

我有一个 C++/winrt 项目,其中包含用 C++ 代码创建的复杂动态 xaml 接口。现在我正在迁移到最新的 VS 15.9.0 Preview 3,它具有对 C++/Winrt 的平台支持,并且还允许在这样的项目中使用 xaml 设计器。但我不想使用设计器并在工具/选项/Xaml 中将其关闭。结果是我的程序化 xaml 元素都没有出现。该项目似乎希望我在 xaml 代码页中输入这些元素,而不是使用 C++,例如Grid()、StackPanel()、view.RowDefinitions.Append()、view.SetRow() 等。 GeneratedFiles 文件夹现在充满了以前项目中不存在但无法删除的项目。是否仍然可以为 xaml 使用 C++ 接口,如果可以,必须做什么才能启用它?谢谢。

【问题讨论】:

    标签: visual-studio xaml c++-winrt


    【解决方案1】:

    Ryan 是正确的:C++/winrt 确实支持 xaml 的编程创建,而且效果很好。在 MS 的几个 c++/winrt 人员的帮助下,我想我也知道为什么我的代码没有做任何事情。在我的应用程序的前一个版本中,我将 MainPage 声明为 C++ 类,而不是结构,并通过获取当前窗口并设置 currentWindow.Content(theGrid) 为 xaml 分配了起始 Grid。但是在新模板应用程序中 MainPage 是一个结构,这可能很重要,并且虽然设置 window.Content 不再有效,但这样做:this->Content(theGrid)。抛开一些与 BlankApp 中的声明无关的问题,我认为这就是答案。如果您按上述方式设置初始内容,则程序化 xaml 将起作用。

    【讨论】:

    • 使用classstruct没有区别。除了默认访问说明符之外,它们在 C++ 中是相同的。不管你做了什么,用struct 替换class 可能不会改变任何事情。
    【解决方案2】:

    很遗憾,这不是使用此 UI 系统的预期方式。基于 XAML 的 UI 系统是 WPF 的后代,它依赖于模型-视图-视图模型 (MVVM) 模式。

    此模式打算使用三种类型的类来构成您的应用程序: 视图,主要用 XAML 编写,只处理显示给定的数据; ViewModels,它是提供视图数据和模型命令的包装器和翻译器;最后是模型,它是您的后端业务逻辑类。

    您不信任设计者的直觉是合理的 - 它会生成混乱且单一的 XAML 代码。但这是预览 XAML 代码外观的绝佳方式。

    回到您的具体情况,库的 API 中存在真正的问题,这些问题将成为在 C++ 中以编程方式定义 UI 的严重障碍。相反,您将希望使用 XAML 来声明 UI。添加和删​​除网格列定义不是很好的支持,但使用StackPanels 和DockPanels 是执行此操作的正常方法。

    如果您有更具体的问题,请随时在此处提出新问题,但请记住,除了、@987654324 之外,您可能还想先在标签 下搜索@ 和

    如果您有更多的问题相当广泛并且对于此处的主站点来说可能过于广泛,请随时加入 the WPF channel on chat,但请记住,我们大多数人都没有专门的 WinRT 经验。

    【讨论】:

    • 谢谢,Zarenor。然而,C++/winrt 完全支持以编程方式构建 xaml,并且在我使用当前的 VS 预览创建一个新项目之前,它运行良好。 C++/Winrt 是相当新的——难道 C++/Winrt 中的所有 xaml 支持现在都消失了?
    • 不,只是库的设计与您所说的完全相反。我最初尝试以编程方式(在 C# 中)在 WPF 中实例化 UI,但您遇到了障碍,其中必要的成员是 private,或protected,或完全缺失。我对暴露给 C++/WinRT 的 API非常熟悉,所以我不会相信我的话,但我知道这不是系统的设计。我非常怀疑 API 在最近的版本之间发生了显着变化。
    • 再次感谢您的回复。对 xaml 的 cppwinrt 支持(曾经是?)非常强大 - 我完全可以轻松地创建一个复杂的动画 UI,该 UI 很容易与程序集成。这些电话仍然存在。我只是不再能让他们产生 xaml。希望我有办法联系肯尼·克尔。
    • C++/WinRT 中编程支持的性质没有任何改变,对带有 XAML 标记的 C++/WinRT 互操作的支持只得到了改进。 API 在后台以相同的方式被调用。我怀疑您在代码或项目中的配置中遇到了其他错误。
    • 谢谢你,瑞恩!我曾希望这是一个配置问题。显然,VS 在开始新的 cppwinrt 项目时创建的 BlankApp 未配置为允许以编程方式创建 xaml。有什么地方可以让我找到需要的东西吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-10
    相关资源
    最近更新 更多