在Revit环境中使用WPF / MVVM的任何人?

时间:2011-09-03 07:04:16

标签: wpf mvvm revit

在Revit环境中使用WPF / MVVM的任何人?

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

有可能吗?

我还希望稍后像Pivotviewer一样嵌入一些Silverlight控件。这可以通过webbrowser& WPF?

感谢。

1 个答案:

答案 0 :(得分:4)

没有明显的理由说Revit 2011 API不支持或Revit 2011产品没有采用强大的UI技术检查两个事实:API建立在Microsoft .NET Framework 3.5上,其中所有WPF组件都是包装和Revit Ribbons显然是使用相同的WPF技术在内部创建的。

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

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

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

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

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

无论如何,别担心。我们发现一些简单而有效的方法。

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

新物品      - > WPF          - >用户控制(WPF)

为简单起见,只需将一个按钮添加到WPF用户控件,方法是像以前一样使用Window Forms进行拖放或直接编辑XAML。

<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

或更好地评论命名空间,如:     //使用System.Windows.Forms;

项目将编译和构建,甚至没有一个警告,假设项目是使用RevitAddinWizard创建的,并且完全遵循上述步骤。更好的是,其他一切准备就绪,例如调试,功能区面板,功能区按钮,资源,命令连接等。

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

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

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

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

更多细节可以从WPF and Revit Addin/API: Popup WPF Window from External Command Using C# and Revit API找到。