【问题标题】:WIX - change dialog text label from background immediate custom actionWIX - 从后台即时自定义操作更改对话框文本标签
【发布时间】:2012-02-14 14:13:30
【问题描述】:

我已经定义了扫描局域网计算机的自定义操作。此操作被声明为立即并在用户单击对话框按钮后触发:

<CustomAction Id="actionGetNetworkComputers" BinaryKey="actionBinary" DllEntry="GetNetworkComputers" Execute="immediate" Return="check"/>

自定义操作代码:

public static ActionResult GetNetworkComputers(Session session)
{
    ListNetworkComputers.NetworkBrowser nb = new ListNetworkComputers.NetworkBrowser(); 
    Microsoft.Deployment.WindowsInstaller.View lView = session.Database.OpenView("DELETE FROM ComboBox WHERE ComboBox.Property='SERVER_LIST'");
    lView.Execute();

    lView = session.Database.OpenView("SELECT * FROM ComboBox");
    lView.Execute();
    int Index = 1;

    try
    {
        foreach (string s in nb.getNetworkComputers())
        {
            Record lRecord = session.Database.CreateRecord(4);

            lRecord.SetString(1, "SERVER_LIST");
            lRecord.SetInteger(2, Index);
            lRecord.SetString(3, s);
            lRecord.SetString(4, s);
            lView.Modify(ViewModifyMode.InsertTemporary, lRecord);
            ++Index;
        }
    }
    catch (Exception ex)
    {
        session.Log(ex.StackTrace);
    }
    lView.Close();


    return ActionResult.Success;       
}

这有两个主要问题:

操作被阻止,因此安装程序窗口冻结,直到 nb.getNetworkComputers 重新运行。如果我将动作返回声明为 asyncWait,则执行动作但检索到的值不会插入到 ComboBox。另外,我需要一些指示操作进度的标签,例如:“正在扫描网络,请稍候”并在扫描结束后隐藏此标签。

用 wix 可以吗?有什么建议吗?

【问题讨论】:

    标签: c# wix windows-installer wix3.5


    【解决方案1】:

    我认为解决此问题的最佳方法是安排 CA 是 Sync Check 退出代码,并让您的 CA 显示它自己的模式对话框,并带有一个取消按钮,告诉您扫描正在进行中。然后使用 BackgroundProcess 类旋转扫描,同时检查是否选择了取消。完成后(真实或取消)设置状态属性并返回成功。

    然后在您的 MSI 控制事件中,您可以检查该属性并根据您的业务规则禁止转换到下一个对话框或允许它(互斥控制事件条件)。

    【讨论】:

    • 您的意思是从自定义操作调用生成对话框吗?我不确定如何从自定义操作中显示生成对话框,我也不确定如何使用 BackgroundProcess 类。我应该将网络扫描内容移动到后台线程并在用户单击取消按钮后退出线程吗?我知道如何使用 winforms 窗口执行此操作,但我不知道在这种情况下如何使用 wix spawn 对话框。你能再解释一下吗?
    • 不,在这种情况下,我实际上是在说要在 .NET 中处理 UI。您的第一个对话框将调用 DoAction YourCustomAction 并且您的自定义操作将抛出一个前台模式对话框,显示进度并允许取消,同时允许取消操作。我发现后台进程易于使用,但如果您知道如何使用线程以另一种方式进行操作,那也很好。
    • 好的,但据我所知(如果我错了,请纠正我),在 wix 安装过程中显示模式对话框的唯一方法是使用生成对话框。任何直接使用 .net 东西(例如 winformms)创建的 gui 将始终是无模式的,它甚至可以出现在安装程序窗口下方 - 这是不可接受的。所以 - 要清楚:你的意思是我应该调用标准的 .net 对话框(winforms 窗口)或某种 wix/msi 对话框?在第一种情况下 - 似乎不可能使其成为模态,在第二种情况下,我不知道如何使用那种对话框来中断我的网络扫描线程
    • 或者我相当肯定有一些方法可以在 .NET 中创建模式对话框并确保将其置于前台。您可能必须 P/Invoke 或其他东西,但它可以完成。当表单加载时,它会在另一个线程上触发您的后台进程并等待它返回。同时可以按下取消按钮,向后台进程发送消息,终止后台工作线程,然后退出表单。此时,您的 CA 将控制权返回给 MSI。这是可以做到的,您可能只需要在 .NET 方面工作。
    • 你确定吗?即使我将在自定义操作中创建的 winforms 窗口置于顶部,这仍然是错误的方式,因为 .net 窗口需要父窗口是模态的(父窗口句柄)。以您所说的方式,仍然可以单击安装程序窗口并使我的窗口处于非活动状态(如果它具有“始终在顶部”标志,则不隐藏,但处于非活动状态),因为无法将 msi 安装程序窗口设置为父窗口对于winforms窗口。我已经想通了,wix 文档也很清楚——他们说,我应该使用生成对话框来显示真正的模态对话框,并与安装程序 ui 集成。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-10
    • 2013-04-26
    • 1970-01-01
    • 2019-05-21
    相关资源
    最近更新 更多