2

有人在 Revit 环境中使用 WPF/MVVM 吗?

有兴趣听到任何反馈,即框架吗?

可能吗?

我还想稍后嵌入一些 Silverlight 控件,例如 Pivotviewer。这可以通过网络浏览器和 wpf 实现吗?

谢谢。

4

1 回答 1

4

Revit 2011 API 不支持或 Revit 2011 产品不采用强大的 UI 技术检查没有明显的原因,从两个事实来看:API 建立在 Microsoft .NET Framework 3.5 之上,其中封装了所有 WPF 组件,以及Revit Ribbons 显然是使用相同的 WPF 技术在内部创建的。

唯一剩下的就是我们必须自己挖掘一些细节并解决一些问题。

最大的障碍是 Window (WPF) 模板(不是 Windows Form 模板)不能直接用于类库类型的项目。如果我们在关注的 Revit Addin 项目中添加一个新项目,该项目是手动或使用 RevitAddinWizard 自动创建的,在 Add New Item 对话框的 WPF 节点下,我们只能在 IDE 中看到 User Control (WPF) 模板的 Visual Studio 2008。

另一方面,如果我们从头创建一个 WPF Application 类型的项目并将项目类型切换到类库,则会出现一些编译错误,例如“<b>库项目文件无法指定 ApplicationDefinition 元素。” 最烦人的部分是,即使我们可以通过某种方式解决错误,我们也必须手动添加所有 Revit 插件的东西,例如组件引用、命名空间、外部应用程序和命令的骨架、功能区创建、这些功能区之间的连接按钮、外部应用程序和外部命令、资源管理代码等。

哎哟! 如果有其他选择,我不相信人们愿意这样做。

Microsoft Visual Studio 方面的限制很奇怪。为什么不允许通过其 IDE 将 WPF 窗口添加到类库项目中以使 Revit 开发人员的生活更轻松一些?

无论如何,不​​要担心。我们发现一些简单且有效的方法。

我们按照以下路径创建一个新的用户控件(WPF)并将其命名为 UserControl1.XAML,例如:

新项目->WPF->用户控制(WPF)

为简单起见,通过像以前一样使用窗口窗体拖放或直接编辑 XAML,只将一个按钮添加到 WPF 用户控件。

<UserControl x:Class="RevitAddinCSWPF.UserControl1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Height="300" Width="300">
    <Grid>
        <Button Margin="42,116,45,149" Name="button1" Click="button1_Click">Helllo from WPF</Button>
    </Grid>
</UserControl>

现在双击按钮并实现它的回调,如:

private void button1_Click(object sender, RoutedEventArgs e)
{
    MessageBox.Show("Hello friends! I am from the WPF world!");
}

接下来,我们动态创建一个 WPF 窗口,并通过我们关心的外部命令的 Execute() 回调中的简单和功能性 Content 属性将它和 WPF 用户控件连接在一起。如果它是由 RevitAddinWizard 创建的,则放置代码的好地方是 TODO 注释下方,例如:

    //TODO: add your code below.
    UserControl1 userControl = new UserControl1();
    Window win = new Window();
    win.Content = userControl;
    win.Show();

在构建插件项目之前,我们必须再做一点小调整。由于 PresentationFramework 程序集引用已由 WPF 用户控件项创建自动引入项目,并且其命名空间 System.Windows 现在与 WinForm System.Windows.Forms 具有相同的 MessageBox 类型,因此将出现一条模棱两可的错误消息为简单的 MessageBox.Show() 调用生成。

在使类型完全合格后,如:

System.Windows.Forms.MessageBox.Show

或者更好地注释掉命名空间,例如: //using System.Windows.Forms;

假设该项目是使用 RevitAddinWizard 创建的并且完全遵循上述步骤,则该项目将编译和构建而不会发出任何警告。更好的是,其他一切都准备好了,例如调试、功能区面板、功能区按钮、资源、命令连接等等。

现在,在 Revit 启动后,无论是在 Visual Studio IDE 内部按 F5 还是在它外部,“加载项”功能区选项卡下都会出现另一个功能区面板。假设项目名为 RevitAddinCSWPF,新的功能区面板和按钮将出现。

如果单击 ExtCmd 按钮,将显示一个 WPF 窗口,正如我们预期的那样。更好的是,窗口图标已自动设置为默认的 Revit TaskDialog 之一。

如果按下按钮,测试插件会打招呼并自我介绍一下。

因此,它清楚地证明了这个概念,在使用 Revit 2011 API 和更新版本的 Revit 插件中显示 WPF 窗口根本不是问题。

可以从WPF 和 Revit Addin/API 中找到更多详细信息:Popup WPF Window from External Command Using C# and Revit API

于 2011-11-16T22:48:12.830 回答