退出前的 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)
添加对WixUIExtension.dll的引用(我电脑上的路径是下C:\Program Files (x86)\WiX Toolset v3.11\bin)
添加对消息框上图标的引用 (Product.wxs):
<二进制 ID="WixUI_Ico_Info" 源文件="Images/MyIcon.ico" />
自己控制:
<控件类型="PushButton" Id="cancelBtn" Width="56" Height="17" X="300" Y="244" Cancel="yes">
<文本>取消
<发布事件="SpawnDialog" 值="CancelDlg">1
我正在使用 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)
添加对WixUIExtension.dll的引用(我电脑上的路径是下C:\Program Files (x86)\WiX Toolset v3.11\bin)
添加对消息框上图标的引用 (Product.wxs):
<二进制 ID="WixUI_Ico_Info" 源文件="Images/MyIcon.ico" />
自己控制:
<控件类型="PushButton" Id="cancelBtn" Width="56" Height="17" X="300" Y="244" Cancel="yes"> <文本>取消 <发布事件="SpawnDialog" 值="CancelDlg">1