C# 如何模拟点击按钮?

C# 如何模拟点击按钮?,c#,user-interface,revit-api,revit,C#,User Interface,Revit Api,Revit,我在revit API功能区中有一个按钮,希望模拟按下按钮以执行一些测试。我需要当前活动文档中的ExternalCommandData对象。然而,我似乎找不到任何类似按钮的东西。单击功能 var panel = Application.CreateRibbonPanel("a", "b") var buttonData = new PushButtonData(name, name, ApplicationInfo.AddInPath, "TestZone.Commands." + "Defau

我在revit API功能区中有一个按钮,希望模拟按下按钮以执行一些测试。我需要当前活动文档中的ExternalCommandData对象。然而,我似乎找不到任何类似按钮的东西。单击功能

var panel = Application.CreateRibbonPanel("a", "b")
var buttonData = new PushButtonData(name, name, ApplicationInfo.AddInPath, "TestZone.Commands." + "DefaultCommand");
var button = panel.AddItem(buttonData) as PushButton;
应用程序当然是OnStartup函数上的默认应用程序。无论如何,要知道如何模拟按钮单击,以便在最终版本中获取当前打开文档的ExternalCommandData对象,将进行检查以确保文档已打开ext。或者是否有其他方法获取ExternalCommandData


请注意,这个问题可能需要您了解revit API,我怀疑仅仅了解c就足以回答这个问题

如果不运行命令,就无法获取ExternalCommandData对象

您可以使用UI自动化以编程方式单击按钮。为命令配置键盘快捷键并使用UI自动化为您模拟按键可能更简单


有关在Revit中使用UI自动化的信息,请参见Jeremy Tammik的博客:

您不能模拟单击以启动外部命令,也不能自己创建有效的ExternalCommandData对象。在调用事件处理程序并在回调函数中为其提供有效的Revit API上下文(即Revit事件处理程序,如外部命令执行方法)时,只有Revit可以这样做

但是,您可以从其他有效的Revit API上下文启动外部命令,就像您可以使用PostCommand API启动内置Revit命令一样:


我在单元测试Revit时遇到了许多相同的问题——其他用户是对的,如果不运行命令,就无法获取ExternalCommandData对象。幸运的是,有一个框架可以通过在外部自动启动和运行Revit来实现这一点。

Dynamo小组构建了这个框架来自动化他们的测试,它提供了很多强大的功能

最适合您的是,它实际上公开了一个有效的ExternalCommandData对象

下面是他们框架中的一些示例代码

/// <summary>
/// Using the TestModel parameter, you can specify a Revit model
/// to be opened prior to executing the test. The model path specified
/// in this attribute is relative to the working directory.
/// </summary>
[Test]
[TestModel(@"./bricks.rfa")]
public void ModelHasTheCorrectNumberOfBricks()
{
    var doc = RevitTestExecutive.CommandData.Application.ActiveUIDocument.Document;

    var fec = new FilteredElementCollector(doc);
    fec.OfClass(typeof(FamilyInstance));

    var bricks = fec.ToElements()
        .Cast<FamilyInstance>()
        .Where(fi => fi.Symbol.Family.Name == "brick");

    Assert.AreEqual(bricks.Count(), 4);
}
RevitTestExecutive.CommandData提供您正在查找的ExternalCommandData

请注意,在您的计算机上以管理员身份安装RTF存在问题。我建议以本地用户身份将其安装到本地目录,这样您就不会遇到Windows UAC问题