退出前的 Wix 工具集确认对话框

Wix Toolset confirmation dialog before exit

我正在使用 Wix 工具集(在 VS 2012 中) 开发一个安装 msi 文件,并遇到无法添加 确认对话框的问题用户按下按钮 'Cancel'。我尝试在消息框中添加自定义操作 dll,但是如果函数 returns ActionResult.Failure,那么我的设置会显示错误对话框。

原对照:

<Control Type="PushButton" Id="progressCancelBtn" Width="56" Height="17" X="296" Y="244">
   <Text>Cancel</Text>
   <Publish Event="EndDialog" Value="Exit" />
</Control>

尝试编号 1:

public class CustomActions
    {
        [CustomAction]
        public static ActionResult ShowExitMessageBox(Session session)
        {
            DialogResult result = MessageBox.Show("Exit installation?", "Exit", MessageBoxButtons.YesNo);

            if (result == DialogResult.Yes)
            {
                return ActionResult.Failure;
            }
            else
            {
                return ActionResult.Success;
            }
        }
    }

自定义操作:

 <CustomAction Id='ShowExitMsgBox' BinaryKey='CustomActions' DllEntry='ShowExitMessageBox' Execute='immediate'               Return='ignore'/>

    <Binary Id='CustomActions' SourceFile='$(var.CASourcesPath)\CustomActions.CA.dll'/>

并尝试使用:

<Control Type="PushButton" Id="cancelBtn" Width="56" Height="17" X="300" Y="244" Cancel="yes">
    <Text>Cancel</Text>
    <Publish Event="DoAction" Value="ShowExitMsgBox">1</Publish>
    <!--Publish Event="EndDialog" Value="Exit" /-->
</Control>

但它显示为失败,而不是取消。

提前感谢您的帮助。

更新:

我将自定义操作 C# 代码更改为下一个:

public class CustomActions
    {
        [CustomAction]
        public static ActionResult ShowExitMessageBox(Session session)
        {
            DialogResult result = MessageBox.Show("Exit installation?", "Exit", MessageBoxButtons.YesNo);

            if (result == DialogResult.Yes)
            {
                session["CANCELEDPROP"] = "1";
            }
            else
            {
                session["CANCELEDPROP"] = "0";
            }

            return ActionResult.Success;
        }
    }

和WIX部分:

// in Product.wxs
<Property Id="CANCELEDPROP" Secure="yes">0</Property> 
// in UIFile.wxs
<Control Type="PushButton" Id="cancelBtn" Width="56" Height="17" X="300" Y="244" Cancel="yes">
    <Text>Cancel</Text>
    <Publish Event="DoAction" Value="ShowExitMsgBox">1</Publish>
    <Publish Event="EndDialog" Value="Exit">CANCELEDPROP=1</Publish>
</Control>

它在第一页上有效,但我在进度页面上收到错误消息:"Windows installer has stopped working" 在我按下消息框上的某个按钮后。 :( 我发现如果我不使用消息框,那么一切正常。很奇怪。

更新 2:

我尝试使用 session.Message 而不是 Windows.Forms,但是消息框没有出现。奇怪。

[CustomAction]
public static ActionResult ShowExitMessageBox(Session session)
{
    Record record = new Record();
    record.FormatString = "Exit installation?";

    MessageResult result = session.Message(InstallMessage.Warning 
                                                    | (InstallMessage)System.Windows.Forms.MessageBoxIcon.Warning 
                                                    | (InstallMessage)System.Windows.Forms.MessageBoxButtons.YesNo,
                                                    record);

    if (result == MessageResult.Yes)
    {
        session["CANCELEDPROP"] = "1";
    }
    else
    {
        session["CANCELEDPROP"] = "0";
    }

    return ActionResult.Success;
}

最后我找到了使用 WixUIExtension.dll 中的 CancelDlg 的解决方案 (http://wixtoolset.org/documentation/manual/v3/wixui/dialog_reference/wixui_dialogs.html)

  1. 添加对WixUIExtension.dll的引用(我电脑上的路径是下C:\Program Files (x86)\WiX Toolset v3.11\bin)

  2. 添加对消息框上图标的引用 (Product.wxs):

    <二进制 ID="WixUI_Ico_Info" 源文件="Images/MyIcon.ico" />

  3. 自己控制:

    <控件类型="PushButton" Id="cancelBtn" Width="56" Height="17" X="300" Y="244" Cancel="yes"> <文本>取消 <发布事件="SpawnDialog" 值="CancelDlg">1