wpf - WPF Revit 插件的最佳起点

标签 wpf mvvm revit-api

我想重写我的 Revit 插件之一,以便它通过 MVVM 使用 WPF,因为与 Windows 窗体相比,我更喜欢 WPF 的外观和功能。

我已将 Jeremy Tammik 的 Revit 模板向导用于基于表单的加载项,但添加 WPF 用户控件似乎不起作用(无法找到 xaml 资源的运行时错误)。

我在示例中发现了一个 WPF MVVM revit 添加(AddMaterials, here is the github link ,它将从 Excel 电子表格添加 Material ),但它不符合我期望在顶层看到的内容。

  • Revit Add ins 有一个 app.cs 文件,它告诉 Revit 如何注册和访问 DLL(功能区面板按钮等)。
  • Windows WPF 应用程序会将 app.xaml 作为顶级入口点。
  • “添加 Material ”项目两者都没有,这告诉我它必须是 类库,但是 View 不使用 UserControls 相反,它们是我更喜欢的Windows。然而 Visual Studio 并没有 让您为类库类型项目添加窗口。

第三个问题很容易解决,只需将窗口从 WPF 应用程序项目复制到类库项目中即可。但我不太明白如果不遵循模板中的 app.cs 代码,类库将如何在 Revit 中实例化。还有其他人以这种方式创建加载项吗?如果是的话,您能让我了解任何有帮助的技巧或讨论吗?有人为 Visual Studio 创建过 WPF Revit 插件模板吗?

当我添加 WPF 窗口并尝试实例化它时,出现错误,指出找不到 xaml 资源(System.IO.IOException:无法找到资源“xxxx.xaml”)。我尝试根据谷歌搜索此错误时找到的建议来修复此问题,但无济于事。我认为它来自于基于表单的项目,并且我可能必须从一个没有表单内容的新项目开始。

我现在已经验证,您确实可以从 Revit AddIn Wizzard 开始并使用 WPF 。 。 。我从头开始,复制到另一个项目中创建的窗口中并让它运行(在添加各种引用、命名空间等之后)。所以我的问题似乎只是与原始项目有关,它已经添加了一堆表单内容。

最佳答案

是的,我正在使用 WPF 创建 Revit 插件。效果很好。您可以从 SDK 示例轻松创建自己的 WPF 模板:

  1. 从 Autodesk 提供的 SDK 示例之一开始。我使用了“DockableDialogs”示例。我知道这个有效,你的里程可能与其他的不同。如果您要在 UI 中查找窗口而不是停靠 Pane ,另一个示例(可能是 AddMaterials 示例)可能更简单。
  2. 我使用 Visual Studio 将示例转换为模板。文件 - 导出模板 -> 选择“DockableDialogs”或其他 WPF 示例项目。
  3. 根据您刚刚创建的模板创建一个新项目。这是我能找到的正确连接 WPF 内部位的最简单方法。

我并不是特别熟悉 AddMaterials 项目,但为了澄清您的要点。

  1. Revit 插件 - 这不是文件名 (app.cs),而是它们必须扩展 IExternalApplicationIExternalCommand。如果您要创建 xaml 界面(而不仅仅是从功能区按钮运行命令),您将使用“IExternalApplication”作为入口点。在示例中查找类似的内容:

    public class ThisApplication : IExternalApplication ...
    
  2. 我没有使用顶级 app.xaml,而是使用由 Revit 应用程序调用的 page.xaml 页面。就我而言,这些是页面而不是 Windows,它们扩展了 IDockablePaneProvider 类。这些必须在应用程序中注册,然后可以显示、隐藏您的 Pane 等。我想这对于 Windows 来说会更简单,但我自己还没有这样做过。对于可停靠 Pane ,您的 xaml.cs 应该以如下形式开始:

      public partial class MainPage : Page, Autodesk.Revit.UI.IDockablePaneProvider ...
    
  3. 是的,该项目是一个类库,因为它是类的集合,其中至少有一个类扩展了 IExternalApplicationIExternalCommand。请记住,您不是在创建独立的应用程序,而是向现有 Windows 应用程序 (Revit) 添加功能。 Revit 将实例化 ThisApplication 类,然后在 Revit 应用程序启动时调用其 .OnStartup() 方法。不过,这不应阻止您向项目添加 .xaml 或 .cs 文件。我可以使用 VS Community 2015 使用 Ctrl-Shift-A 来完成此操作。

希望这能让您开始 - 我已经能够在 Revit 中实现 WPF UI,而无需任何 WPF 经验,而且我什至不是真正的程序员,所以这绝对是可能的。祝你好运!

附录

如果您想将 WPF 元素添加到现有的 Revit 插件中,可以按照此处的说明进行操作:How can I connect xaml and xaml.cs files

最终,我发现将我的插件代码迁移到由工作示例制作的模板中更容易,您可能也想尝试这种方法。

关于wpf - WPF Revit 插件的最佳起点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40096793/

相关文章:

.net - 如何根据默认样式创建样式?

wpf - 如何使用触发器检查复选框?

c# - IronPython 和 Revit API - 如何在列表框中显示项目属性(属性名称)?

c# - Caliburn 在 ComboBox 上重置 SelectedIndex

c# - 防止 Revit 窗口打开

python - 使用python在revit中创建和分配子类别

c# - 无法从数据网格 "Object reference not set to an instance of an object."更新项目

c# - 将控件添加到 C# 2015 中,未找到 this.Controls.Add(bla) 方法?

wpf - 跨 View 模型的命令

c# - 如何找到与 TreeViewItem 关联的底层元素