我正在使用 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;
}
答案 0 :(得分:1)
最后,我通过使用WixUIExtension.dll中的CancelDlg找到了解决方案 (http://wixtoolset.org/documentation/manual/v3/wixui/dialog_reference/wixui_dialogs.html)
添加对WixUIExtension.dll的引用(我的计算机上的路径是下一个C:\ Program Files(x86)\ WiX Toolset v3.11 \ bin)
添加对消息框(Product.wxs)上的图标的引用:
&LT;二进制Id =&#34; WixUI_Ico_Info&#34;的SourceFile =&#34;图像/ MyIcon.ico&#34; /&GT;
控制自己:
&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;