退出

时间:2017-07-05 16:39:07

标签: c# wix custom-action

我正在使用 Wix工具集(在VS 2012中)开发一个安装msi文件,并遇到一个问题,即当用户按下按钮时我无法添加确认对话框&# 39;取消' 即可。我试图在消息框中添加自定义动作dll,但是如果该函数返回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>

它适用于第一页,但我在进度页面上收到错误:&#34; Windows安装程序已停止工作&#34;我按下消息框上的一些按钮后。 :( 我发现如果我不使用消息框,那么一切正常。这很奇怪。

更新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;
}

1 个答案:

答案 0 :(得分:1)

最后,我通过使用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)上的图标的引用:

    &LT;二进制Id =&#34; WixUI_Ico_Info&#34;的SourceFile =&#34;图像/ MyIcon.ico&#34; /&GT;

  3. 控制自己:

    &LT;控制类型=&#34; PushButton&#34; ID =&#34; cancelBtn&#34;宽度=&#34; 56&#34;高度=&#34; 17&#34; X =&#34; 300&#34; Y =&#34; 244&#34;取消=&#34;是&#34;&GT;     &LT;文本和GT;取消     &LT;发布事件=&#34; SpawnDialog&#34;值=&#34; CancelDlg&#34;大于1 &LT; /控制&gt;