Ho affrontato questo problema in 3 parti:
- definire una proprietà OSWarningText che viene impostato quando un avvertimento deve essere somministrato solo
- authoring una schermata di avviso personalizzato
- Inserimento l'avviso personalizzato schermo nella sequenza UI, se necessario
1. Definizione di un puntello OSWarningText erty
Innanzitutto, dichiarare la proprietà e dare il valore "disinserito" di default:
<Property Id="OSWarningText" Value="{}"/>
per costruire il valore effettivo della proprietà, impostare una proprietà intermediario per ogni possibile avvisi. Assicurarsi che le condizioni per ogni avvertimento non si sovrappongono:
<SetProperty Id="OSWarningText1" After="AppSearch"
Value="Detected XP SP [ServicePackLevel]. SP3 or higher is recommended.">
<![CDATA[(VersionNT = 501) AND NOT (ServicePackLevel >= 3)]]>
</SetProperty>
<SetProperty Id="OSWarningText2" After="SetOSWarningText1"
Value="Detected Vista SP [ServicePackLevel]. SP2 or higher is recommended.">
<![CDATA[(VersionNT = 600) AND NOT (ServicePackLevel >= 2)]]>
</SetProperty>
Assumendo che le condizioni non si sovrappongano, siamo in grado di condensare in modo sicuro le avvertenze in una singola proprietà come questa:
<SetProperty Id="OSWarningText" After="SetOSWarningText2"
Value="[OSWarningText1][OSWarningText2]" />
2. Creazione una schermata di avviso personalizzata.
Questo è simile allo example for adding a checkbox for the desktop shortcut. Copia una delle definizioni di dialogo esistenti da wix sources, ad es. InstallDirDlg.wxs
e rinominarlo in WarningDlg.wxs
.
Impostare l'ID della finestra di dialogo su Id="WarningDlg
. Striscia i controlli inutili e li sostituisce con un'immagine di avvertimento e la nostra OSWarningText definito in precedenza:
<Control Id="OSWarning" Type="Text" X="100" Y="80" Width="250" Height="60"
NoPrefix="yes" Text="[OSWarningText]" />
<Control Id="WarningIcon" Type="Icon" X="20" Y="60" Width="64" Height="64"
Text="Warning.ico" >
<Binary Id="Warning.ico" SourceFile="..\icons\warning.ico"/>
</Control>
L'idea è quella di creare qualcosa di simile:
3. Inserimento l'avviso personalizzato schermata nella sequenza dell'interfaccia utente
Ora è necessario assicurarsi che la schermata di avviso sia visualizzata tra la finestra di dialogo di benvenuto e la finestra di dialogo del contratto di licenza, ma solo se effettivamente c'è un avvertimento da mostrare.Questo è un caso speciale del più generale problema branching wizard sequences.
Anche in questo caso, copiare una sequenza UI predefinita dalle origini wix, ad es. WixUI_InstallDir.wxs
e rinominare l'ID UI su Id="MyWixUI"
. Fai riferimento a questo nel tuo file wxs principale come <UIRef Id="MyWixUI" />
. Ora trova e modifica i gestori di eventi per il pulsante Avanti di WelcomeDlg.
È possibile impostare le proprietà in risposta a una pressione di un pulsante e una condizione aggiuntiva, e è possibile visualizzare la finestra di dialogo successiva in base a una proprietà. Faremo uso di tale per gestire il pulsante accanto WelcomeDlg come questo:
- reimpostare la proprietà WelcomeDlg_Next a "unset"
- impostare la proprietà WelcomeDlg_Next a "WarningDlg", ma solo se OSWarningText è impostato
- imposta la proprietà WelcomeDlg_Next su "LicenseAgreementDlg" ma solo se OSWarningText NON è impostato.
- Mostra la finestra di dialogo fornita da WelcomeDlg_Next, se la proprietà era impostata correttamente.
Il codice Wix fare che assomiglia a questo:
<Publish Dialog="WelcomeDlg" Control="Next"
Property="WelcomeDlg_Next" Value="{}"
Order="1">1</Publish>
<Publish Dialog="WelcomeDlg" Control="Next"
Property="WelcomeDlg_Next" Value="WarningDlg"
Order="2">OSWarningText</Publish>
<Publish Dialog="WelcomeDlg" Control="Next"
Property="WelcomeDlg_Next" Value="LicenseAgreementDlg"
Order="3">NOT OSWarningText</Publish>
<Publish Dialog="WelcomeDlg" Control="Next"
Event="NewDialog" Value="[WelcomeDlg_Next]"
Order="4">WelcomeDlg_Next</Publish>
Poi fare l'equivalente per il contratto di licenza pulsante "indietro": dovrebbe tornare alla schermata di benvenuto se non v'è alcun avviso, oppure alla schermata di avviso.