2009-09-02 4 views
5

Sto usando WixUIFeatureTree per offrire all'utente l'opzione di quali componenti della mia applicazione vogliono installare ... Una delle mie caratteristiche ha due funzioni opzionali al suo interno, almeno una delle quali deve essere installata affinché il programma funzioni. Non voglio forzare l'utente a installare uno dei due, ma non riesco a capire come forzarli a scegliere almeno uno.Come posso richiedere almeno uno dei due componenti opzionali in WiX?

Ecco la quota di competenza del mio attuale WXS:

<Feature Id="Main" Title="Product Name" Level="1" Absent="disallow" Display="expand" AllowAdvertise="no" 
      Description="This is the application, and is a required component" 
      > 
     <ComponentRef Id="Baseline" /> 
     <ComponentRef Id="Shortcuts" /> 
     <Feature Id="Option1" Title="Plugin #1" Level="2" Absent="allow" AllowAdvertise="no"> 
      <ComponentRef Id="Plugin1Component" /> 
     </Feature> 
     <Feature Id="Option2" Title="Plugin #2" Level="3" Absent="allow" AllowAdvertise="no"> 
      <ComponentRef Id="Plugin2Component" /> 
     </Feature> 
    </Feature> 

Sto indovinando che ho intenzione di bisogno di un qualche tipo di azione personalizzata inserita al punto giusto della sequenza garantire che uno o l'altro è selezionato per l'installazione, ma non ha idea di come farlo, o se è giusto. Tutto apprezzato!

risposta

2

Penso che quello che in realtà si vuole fare qui è mettere una condizione nell'elemento <Pubblica> per il pulsante Avanti per non abilitarlo fino a quando le condizioni sono soddisfatte. Qualcosa di simile:

<Publish Dialog="..." Control="Next" Event="NewDialog" Value="...">OptionalPkg1Selected OR OptionaloPkg2Selected</Publish> 

Quello che non so è come impostare le condizioni in base alle quali vengono controllati i componenti, anche se ci deve essere un modo per farlo in modo tale che i componenti giusti vengono installati in seguito ..

+0

Sì, proverei questo prima. Altrimenti, non credo che WiX abbia un "entrambi o" disponibile. Si potrebbe anche avere una finestra di dialogo personalizzata in cui l'utente deve selezionare un'opzione o l'altra. – JasCav

+0

Mi rendo conto che questo è un post antico, ma grazie Jeff. Il tuo post mi ha indirizzato nella giusta direzione. Ho pubblicato la mia soluzione, in base alla tua, come risposta qui sotto (quella che ha funzionato almeno per me, in WiX v3.7). –

0

Non ho tempo per eseguire un test tecnico in questo momento, ma voglio solo indicarti la direzione della Proprietà INSTALLLEVEL. È un concetto piuttosto contro-intuitivo relativo alle selezioni di funzionalità. Essenzialmente c'è un INSTALLLEVEL complessivo dell'installazione, che è un numero compreso tra 1 e 32.767 e le caratteristiche hanno ciascuna una proprietà Install Level, che è un numero compreso tra -32.767 e 32.767. Se il valore del Livello di installazione di una funzionalità è inferiore o uguale alla proprietà INSTALLLEVEL del prodotto, la funzionalità è attivata: http://kb.acresso.com/selfservice/viewContent.do?externalID=Q103232

Generalmente si utilizza questo per impostare gli stati delle funzionalità predefinite e per disabilitare le funzionalità nascoste sui sistemi operativi in ​​cui la funzione non è supportato Tuttavia, potresti essere in grado di utilizzare queste proprietà insieme a un'esecuzione di azioni personalizzate nell'evento del pulsante successivo della finestra di dialogo per imporre la selezione di almeno una delle tue funzionalità.

E sì, i dialoghi MSI in generale non hanno senso e sono un modo complicato con cui lavorare. In alcuni casi, ho sostituito una singola finestra di dialogo in una sequenza con una normale finestra di dialogo di Windows exe per ovviare alle limitazioni nel concetto generale della GUI di MSI.

Ci penserò se c'è un modo più semplice per farlo. Sembra che questo è molto urgente, però, quindi forse si vuole verificare con le comunità di implementazione e sfogliare alcuni dei migliori siti di distribuzione:

+0

Forse anche http://www.tramontana.co.hu/wix/lesson2.php#2.1. –

+0

Sì, in effetti sto utilizzando la funzione INSTALLLEVEL per impostare i componenti predefiniti (in realtà, selezionandone uno). Tuttavia, nulla impedisce all'utente di spegnerli entrambi, che è ciò che voglio ottenere. –

+0

Che ne dici di nascondere le funzionalità nell'albero delle caratteristiche e quindi di fornire una scelta di stili per i pulsanti di opzione nella finestra di dialogo successiva? Hai bisogno di alcune modifiche alle finestre di MSI per fare questo, ma c'è un articolo su Installsite su come farlo. Voglio solo chiederlo prima che lo scavassi. –

1

Come utilizzare lo stato della funzione come condizione?

Qualcosa di simile (& Option1 = 2) e (& Option2 = 2)

Questo è il link per una migliore comprensione:

MSI Advanced Custom Actions

+0

Questo è quello che ho finito per fare. Ho usato gli stati di funzionalità come condizione per forzare una delle due opzioni nel livello 0 (nessuna installazione) –

4

mi rendo conto che è un vecchio post, ma questo è come ho risolto questo usando v3.7 WIX con l'interfaccia utente FeatureTree:

<Publish Dialog="CustomizeDlg" Control="Next" Event="NewDialog" Value="VerifyReadyDlg">&amp;MyAppClientFeature=3 OR &amp;MyAppPrinterFeature=3</Publish> 

completa FeatureT codice override ree:

<UI Id="WixUI_FeatureTreeCustom"> 
    <TextStyle Id="WixUI_Font_Normal" FaceName="Tahoma" Size="8" /> 
    <TextStyle Id="WixUI_Font_Bigger" FaceName="Tahoma" Size="12" /> 
    <TextStyle Id="WixUI_Font_Title" FaceName="Tahoma" Size="9" Bold="yes" /> 

    <Property Id="DefaultUIFont" Value="WixUI_Font_Normal" /> 
    <Property Id="WixUI_Mode" Value="FeatureTree" /> 

    <DialogRef Id="ErrorDlg" /> 
    <DialogRef Id="FatalError" /> 
    <DialogRef Id="FilesInUse" /> 
    <DialogRef Id="MsiRMFilesInUse" /> 
    <DialogRef Id="PrepareDlg" /> 
    <DialogRef Id="ProgressDlg" /> 
    <DialogRef Id="ResumeDlg" /> 
    <DialogRef Id="UserExit" /> 

    <Publish Dialog="ExitDialog" Control="Finish" Event="EndDialog" Value="Return" Order="999">1</Publish> 

    <Publish Dialog="WelcomeDlg" Control="Next" Event="NewDialog" Value="LicenseAgreementDlg">NOT Installed</Publish> 
    <Publish Dialog="WelcomeDlg" Control="Next" Event="NewDialog" Value="VerifyReadyDlg">Installed AND PATCH</Publish> 

    <Publish Dialog="LicenseAgreementDlg" Control="Back" Event="NewDialog" Value="WelcomeDlg">1</Publish> 
    <Publish Dialog="LicenseAgreementDlg" Control="Next" Event="NewDialog" Value="CustomizeDlg">LicenseAccepted = "1"</Publish> 

    <Publish Dialog="CustomizeDlg" Control="Back" Event="NewDialog" Value="MaintenanceTypeDlg" Order="1">Installed</Publish> 
    <Publish Dialog="CustomizeDlg" Control="Back" Event="NewDialog" Value="LicenseAgreementDlg" Order="2">NOT Installed</Publish> 
    <Publish Dialog="CustomizeDlg" Control="Next" Event="NewDialog" Value="VerifyReadyDlg">&amp;MyAppClientFeature=3 OR &amp;MyAppPrinterFeature=3</Publish> 

    <Publish Dialog="VerifyReadyDlg" Control="Back" Event="NewDialog" Value="CustomizeDlg" Order="1">NOT Installed OR WixUI_InstallMode = "Change"</Publish> 
    <Publish Dialog="VerifyReadyDlg" Control="Back" Event="NewDialog" Value="MaintenanceTypeDlg" Order="2">Installed AND NOT PATCH</Publish> 
    <Publish Dialog="VerifyReadyDlg" Control="Back" Event="NewDialog" Value="WelcomeDlg" Order="3">Installed AND PATCH</Publish> 

    <Publish Dialog="MaintenanceWelcomeDlg" Control="Next" Event="NewDialog" Value="MaintenanceTypeDlg">1</Publish> 

    <Publish Dialog="MaintenanceTypeDlg" Control="ChangeButton" Event="NewDialog" Value="CustomizeDlg">1</Publish> 
    <Publish Dialog="MaintenanceTypeDlg" Control="RepairButton" Event="NewDialog" Value="VerifyReadyDlg">1</Publish> 
    <Publish Dialog="MaintenanceTypeDlg" Control="RemoveButton" Event="NewDialog" Value="VerifyReadyDlg">1</Publish> 
    <Publish Dialog="MaintenanceTypeDlg" Control="Back" Event="NewDialog" Value="MaintenanceWelcomeDlg">1</Publish> 
</UI> 

<UIRef Id="WixUI_Common" /> 

Spero che questo aiuta qualcuno.

+0

Molto bello. Grazie per la pubblicazione. –