2

ユーザーがカスタム アクションを使用してネットワーク共有を選択できるダイアログがあります。この場所が設定されていない限り、ユーザーがインストールを続行できるようにしたくありません。この目的を達成するために、ユーザーを次のダイアログに移動させる PushButton コントロールを無効にしました。私の CustomAction は、その PushButton コントロールの Condition 要素でチェックされるプロパティを設定します。

これはすべてうまくいきます。私を悩ませているのは、ユーザーがダイアログをできるだけ簡単にナビゲートできるようにしたいということです。そのため、ユーザーをブラウズ ダイアログ CustomAction に移動させる PushButton コントロールを、ダイアログの既定のコントロールとして作成しました。これも、CustomAction によって設定されたプロパティの条件に基づいています。プロパティが設定されると、ユーザーを次のダイアログに移動させる PushButton が有効になり、デフォルト コントロールとして設定されます。スクリーンショットでわかるように、これは実際に機能します。

興味深いのは、Dialog の Default コントロールが実際に変更されていることですが、タブ付きコントロールは依然として参照ダイアログ CustomAction を開く PushButton のままです。この状況により、Returnキーが押されると、プロパティが既に設定されている、つまりフォルダー パスが既に選択されているにもかかわらず、ブラウズ ダイアログが再び開くという不規則な動作が発生します。 無効化された [次へ] ボタンが表示されているサンプル インストーラーの最初の画面。 デフォルトのフォーカスされたコントロールは、CustomAction によって作成されたダイアログを表示する Change PushButton コントロールです。 ユーザーがフォルダーを選択した後、同じダイアログを表示しているサンプル インストーラーの 2 番目の画面、つまり VIEWDIR プロパティが設定されている (コードを参照)

この動作を修正する方法はありますか? プロパティの状態に基づいて、あるコントロールから別のコントロールにフォーカスを移したいと考えています。どうすればいいですか?

また: TabSkip と Default 属性はどのように連携しますか?

ダイアログのコードは次のとおりです。

<?xml version="1.0" encoding="UTF-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
  <Fragment>
    <CustomActionRef Id="OpenFolderBrowser"/>
    <UI>
      <Dialog Id="RemoteViewDirectory" X="0" Y="0" Width="374" Height="266" Title="!(loc.GlobalDialogTitle)" NoMinimize="yes">
        <Control Id="TopBanner" Type="Bitmap" X="0" Y="0" Width="374" Height="44" Text="TopBanner" TabSkip="yes" Disabled="yes" />
        <Control Id="BannerLine" Type="Line" X="0" Y="44" Width="373" Height="0" TabSkip="yes" Disabled="yes" />
        <Control Id="DlgSubTitle" Type="Text" X="13" Y="6" Width="292" Height="25" TabSkip="yes" Transparent="yes">
          <Text><![CDATA[{&MSSansBold8}!(loc.VwDrctryDlgSubtitle)]]></Text>
        </Control>
        <Control Id="DlgDesc" Type="Text" X="21" Y="23" Width="292" Height="25" TabSkip="yes" Transparent="yes">
          <Text><![CDATA[{&Tahoma8}!(loc.VwDrctryDlgDesc)]]></Text>
        </Control>
        <Control Id="GroupBox" Type="GroupBox" X="15" Y="174" Width="344" Height="41" TabSkip="yes">
          <Text><![CDATA[!(loc.VwDrctryDlgSubtitle)]]></Text>
        </Control>
        <Control Id="ChangeRemoteFolder" Type="PushButton" X="285" Y="189" Width="66" Height="17" TabSkip="no">
          <Text><![CDATA[!(loc.BtnTextChange)]]></Text>
          <Condition Action="default"><![CDATA[NOT VIEWDIR]]></Condition>
          <Publish Event="DoAction" Value="OpenFolderBrowser" Order="1">1</Publish>
          <Publish Property="VIEWDIR" Value="[REMOTEDIR]" Order="2"><![CDATA[REMOTEDIR]]></Publish>
          <Publish Property="REMOTEDIR" Order="3">1</Publish>
        </Control>
        <Control Id="ChgdLocation" Type="Text" X="57" Y="192" Width="220" Height="20" Property="VIEWDIR" Text="[VIEWDIR]" TabSkip="yes">
          <Condition Action="show"><![CDATA[VIEWDIR]]></Condition>
          <Condition Action="hide"><![CDATA[NOT VIEWDIR]]></Condition>
        </Control>
        <Control Id="DummyNetworkLocation" Type="Text" X="57" Y="192" Width="220" Height="20" Text="!(loc.TxtDummyViewNetworkPath)" TabSkip="yes">
          <Condition Action="show"><![CDATA[NOT VIEWDIR]]></Condition>
          <Condition Action="hide"><![CDATA[VIEWDIR]]></Condition>
        </Control>
        <Control Id="Back" Type="PushButton" X="164" Y="243" Width="66" Height="16" TabSkip="yes">
          <Text>!(loc.BtnTextBack)</Text>
          <Publish Event="NewDialog" Value="PreviousDialog">1</Publish>
        </Control>
        <Control Id="Next" Type="PushButton" X="230" Y="243" Width="66" Height="17" TabSkip="yes">
          <Text>!(loc.BtnTextNext)</Text>
          <Condition Action="enable"><![CDATA[VIEWDIR]]></Condition>
          <Condition Action="disable"><![CDATA[NOT VIEWDIR]]></Condition>
          <Condition Action="default"><![CDATA[VIEWDIR]]></Condition>
          <Publish Event="NewDialog" Value="NextDialog">1</Publish>
        </Control>
        <Control Id="Cancel" Type="PushButton" X="301" Y="243" Width="66" Height="17" TabSkip="yes" Cancel="yes">
          <Text>!(loc.BtnTextCancel)</Text>
          <Publish Event="SpawnDialog" Value="CancelSetup">1</Publish>
        </Control>
        <Control Id="DlgLine" Type="Line" X="0" Y="234" Width="373" Height="0" TabSkip="yes" Disabled="yes" />
      </Dialog>
    </UI>
  </Fragment>
</Wix>

Windows インストーラーによって作成されたログの出力は次のとおりです。

Action 17:36:08: RemoteViewDirectory. Dialog created
MSI (c) (68:AC) [17:36:09:525]: Doing action: OpenFolderBrowser
Action 17:36:09: OpenFolderBrowser. 
Action start 17:36:09: OpenFolderBrowser.
MSI (c) (68:28) [17:36:09:525]: Invoking remote custom action. DLL: C:\...\Temp\MSI9B.tmp, Entrypoint: OpenFolderBrowser
MSI (c) (68!1C) [17:36:18:608]: PROPERTY CHANGE: Adding \\Win2k3iis6\cmak property. Its value is 'exists'.
MSI (c) (68!1C) [17:36:18:608]: PROPERTY CHANGE: Adding REMOTEDIR property. Its value is '\\Win2k3iis6\cmak'.
Action ended 17:36:18: OpenFolderBrowser. Return value 1.
MSI (c) (68:AC) [17:36:18:638]: PROPERTY CHANGE: Adding VIEWDIR property. Its value is '\\Win2k3iis6\cmak'.
MSI (c) (68:AC) [17:36:18:638]: PROPERTY CHANGE: Deleting REMOTEDIR property. Its current value is '\\Win2k3iis6\cmak'.
4

1 に答える 1

2

MSI UI でフォーカスを制御する方法を知りません。あなたが試すことができる1つのことは、[次へ]ボタンをデフォルトのままにして無効にすることです. これにより、Enter キーによって、フォーカスされたボタン (変更ボタン) が押される可能性があります。うまくいかない可能性も十分にあります。MSI UI は、多くの点でかなり制限されています。

2 番目の質問TabSkip属性に答えるには、タブ オーダーからコントロールを削除します。つまり、TabSkip='yes'タブを押してコントロール間を移動するときに、 のコントロールを選択してはなりません。このDefault属性は、Enter キーが押されたときにどのボタンを押すべきかを示します。

于 2013-06-22T20:46:16.740 に答える