【问题标题】:Wix Interactions with Conditions, Properties & Custom ActionsWix 与条件、属性和自定义操作的交互
【发布时间】:2011-05-13 14:45:09
【问题描述】:

我在设置对话框上按钮的启用状态时遇到问题。有问题的按钮定义为:

<Control Id="Next" Type="PushButton" X="236" Y="243" Width="56" Height="17" Default="yes" Text="!(loc.WixUINext)">
<Condition Action="disable">Validated = 0</Condition>
<Condition Action="enable"><![CDATA[Validated <> 0]]></Condition>
<Publish Event="EndDialog" Value="Return">1</Publish>
</Control>

Validated 属性从初始值 0 开始,正如预期的那样,下一个按钮开始禁用。

<Property Id="Validated" Value="0"/>

属性本身是通过另一个按钮上的自定义操作来修改的。

<Control Id="PerformValidation" Type="PushButton" X="225" Y="75" Width="50" Height="20" Text="Validate">
<Publish Event="DoAction" Value="ValidateDB">1</Publish>
</Control>

使用精简版的自定义操作,例如:

[CustomAction]
public static ActionResult ValidateDatabase(Session session)
{
session.Log("Begin ValidateDatabase");
session["Validated"] = "1";
return ActionResult.Success;
}

我面临的问题是,在自定义操作运行后,下一步按钮不会自行重新启用。我可以确认 CA 确实运行了,并且该属性已成功设置。如果我执行其他一些导致它刷新的操作,UI 将更新,例如返回一个页面然后再次前进到该页面,下一步按钮将被启用。

关于如何在自定义操作后刷新按钮状态的任何想法?

【问题讨论】:

    标签: wix wix3.5


    【解决方案1】:

    http://www.mail-archive.com/wix-users@lists.sourceforge.net/msg05097.html 提供了一种解决方案,可以立即重新发布在自定义操作中更改的属性。

    这是我如何让它在我的代码中工作的示例:

    <?xml version="1.0" encoding="utf-8"?>
    <Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
        <Fragment>
            <Binary Id="ConnectionStringExtension.dll" SourceFile="$(var.ConnectionStringExtension.TargetDir)$(var.ConnectionStringExtension.TargetName).CA.dll" />
            <CustomAction Id="MyCustomAction" BinaryKey="ConnectionStringExtension.dll" DllEntry="VerifyConnectionString" Execute="immediate"  />
    
            <UI>
                <Dialog Id="ConnectionStringDlg" Width="370" Height="270" Title="Database Settings - [ProductName]" NoMinimize="yes">
                    <Control Id="ConnectionStringLabel" Type="Text" X="45" Y="73" Width="100" Height="15" TabSkip="no" Text="&amp;Connection String:" />
                    <Control Id="ConnectionStringEdit" Type="Edit" X="45" Y="95" Width="220" Height="15" Property="CONNECTION_STRING" Text="{200}" />
                    <Control Id="Back" Type="PushButton" X="180" Y="243" Width="56" Height="17" Text="&amp;Back">
                    </Control>
                    <Control Id="Next" Type="PushButton" X="236" Y="243" Width="56" Height="17" Default="yes" Text="&amp;Next">
                        <Condition Action="enable"><![CDATA[CONNECTION_STRING <> "" AND CONNECTION_STRING_VALID = "1"]]></Condition>
                        <Condition Action="disable"><![CDATA[CONNECTION_STRING = "" OR CONNECTION_STRING_VALID = "0"]]></Condition>
                    </Control>
                    <Control Id="Cancel" Type="PushButton" X="304" Y="243" Width="56" Height="17" Cancel="yes" Text="Cancel">
                        <Publish Event="SpawnDialog" Value="CancelDlg">1</Publish>
                    </Control>
                    <Control Id="BannerBitmap" Type="Bitmap" X="0" Y="0" Width="370" Height="44" TabSkip="no" Text="WixUI_Bmp_Banner" />
                    <Control Id="Description" Type="Text" X="25" Y="23" Width="280" Height="15" Transparent="yes" NoPrefix="yes">
                        <Text>Please enter database configuration</Text>
                    </Control>
                    <Control Id="BottomLine" Type="Line" X="0" Y="234" Width="370" Height="0" />
                    <Control Id="Title" Type="Text" X="15" Y="6" Width="200" Height="15" Transparent="yes" NoPrefix="yes">
                        <Text>{\WixUI_Font_Title}Database Settings</Text>
                    </Control>
                    <Control Id="BannerLine" Type="Line" X="0" Y="44" Width="370" Height="0" />
                  <Control Id="VerifyButton" Type="PushButton"  Width="56" Height="16" X="45" Y="118" Text="Verify">
                    <Publish Event="DoAction" Value="MyCustomAction">1</Publish>
                    <Publish Property="TEMP_VERIFIED" Value="[CONNECTION_STRING_VALID]">1</Publish>
                    <Publish Property="CONNECTION_STRING_VALID" Value="[TEMP_VERIFIED]" />
                  </Control>
                </Dialog>
            </UI>
        </Fragment>
    </Wix>
    

    CustomAction 将 CONNECTION_STRING_VALID 的值设置为 1 或 0,具体取决于它是否有效,我在其他地方定义了默认值为 0

    <Property Id="CONNECTION_STRING_VALID" Value="0" />
    

    现在,当我单击验证按钮时,如果字符串有效,则启用下一个按钮

    【讨论】:

    • 效果很好。在我看来,这是比双对话方法更好的解决方案。但是,我确实在操作完成和按钮被激活之间经历了几秒钟的延迟。绝对不是问题,只是好奇。
    • 我使用它已经有一段时间了,但从记忆中它对我来说是瞬间完成的,也许与你的行为有关?
    • 发布对我来说是关键(
    【解决方案2】:

    这是众所周知的 Windows Installer 限制。在您以任何其他方式刷新对话框之前,对话框的状态不会改变,例如,正如您正确提到的那样,前后移动。

    这里的解决方法是有两个相同的对话框,DialogA 和 DialogB。 DialogA 上的 PerformValidation 按钮将像现在一样执行验证并调用 DialogB(作为 NewDialog)。同样,DialogB 上的 PerformValidation 按钮也会执行验证并调用 DialogA。因此,每次运行验证时都会加载对话框,并且按钮状态将正确显示。用户不会怀疑任何事情,因为他/她只会看到相同的对话框。 :-)

    更详细地描述了这个想法here。它被称为“双对话框”。

    希望这会有所帮助。

    【讨论】:

    • 谢谢严,我会使用这个技巧。遗憾的是 Windows 安装程序是如此有限。 :)
    • 没有双对话框是可能的,我只是不太明白它是如何工作的,我想弄清楚,请参阅msiext.codeplex.com 并查看他们的 CommonUiMsi.msi 安装程序,它有一个带有验证按钮的数据库创建屏幕,成功后启用,源在那里,他们似乎没有使用辅助对话框,我觉得这与他们如何发布他们的属性有关,但仍在试图弄清楚.
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-06
    • 1970-01-01
    • 1970-01-01
    • 2011-05-18
    • 1970-01-01
    相关资源
    最近更新 更多