2 votes

Comment afficher une boîte de dialogue ou de message pendant la désinstallation dans WiX ?

J'essaie d'afficher une boîte de dialogue ou de message (avec des boutons oui ou non) pendant la désinstallation.
Je dois définir une propriété avec le choix de l'utilisateur dans ma boîte de dialogue (Oui (vrai) ou Non (faux)).
Cette propriété est importante car tous les fichiers vont être supprimés si la réponse de l'utilisateur est "Oui".
J'ai essayé d'afficher une boîte de dialogue personnalisée lors de la désinstallation et cela n'a pas fonctionné. La boîte de dialogue personnalisée ne m'a pas donné d'erreur. Elle n'apparaît même pas dans le journal détaillé.

Voici le dialogue personnalisé :

<Dialog Id="ClearAllDataDlg" Width="260" Height="85" Title="[Setup] - [ProductName]" NoMinimize="yes">
    <Control Id="No" Type="PushButton" X="132" Y="57" Width="56" Height="17" Default="yes" Cancel="yes" Text="[ButtonText_No]">
      <Publish Property="CLEARALLDATA" Value="0" />
      <Publish Event="EndDialog" Value="Return">1</Publish>
    </Control>
    <Control Id="Yes" Type="PushButton" X="72" Y="57" Width="56" Height="17" Text="[ButtonText_Yes]">
      <Publish Property="CLEARALLDATA" Value="1" />
      <Publish Event="EndDialog" Value="Exit">1</Publish>
    </Control>
    <Control Id="Text" Type="Text" X="48" Y="15" Width="194" Height="30">
      <Text>Do yo want to clear all data including your settings?</Text>
    </Control>
    <Control Id="Icon" Type="Icon" X="15" Y="15" Width="24" Height="24" ToolTip="Information icon" FixedSize="yes" IconSize="32" Text="[InfoIcon]" />
  </Dialog>

et la séquence InstallUIS :

<Show Dialog="ClearAllDataDlg" Before="CostFinalize">REMOVE ~= "ALL"</Show>

J'ai essayé After="MigrateFeatureStates" dans la séquence mais cela n'a pas fonctionné non plus.
Dans une autre question, quelqu'un a demandé Arrêt de l'affichage des boîtes de dialogue personnalisées dans la désinstallation de WiX C'est drôle parce que toutes les autres questions essaient de faire le contraire.
Je ne veux pas faire cela à l'intérieur d'une action personnalisée car je veux bloquer la progression de la désinstallation et attendre la réponse de l'utilisateur.
Y a-t-il un moyen d'y parvenir ?
Toute aide serait appréciée. Je vous remercie.

4voto

Brian Sutherland Points 3275

Je fais exactement cela dans l'installation du SDK que nous produisons. L'idée est que si l'utilisateur a effectué un développement réel dans l'installation du SDK, tout est supprimé et nous voulons être sûrs qu'il sauvegarde tout ce dont il a vraiment besoin.

Je n'ai pas créé de nouvelle boîte de dialogue pour cette boîte d'avertissement car une boîte de message est un concept très bien défini et utilisé dans tous les produits Windows.

Dans le produit, j'ai ajouté une action personnalisée programmée antes de que quelque chose se passe réellement.

<CustomAction Id='CA_UninstallWarning' BinaryKey='SDKCustomActionsDLL' DllEntry='UninstallWarning' Execute='immediate' Return='check' />

<InstallExecuteSequence>
    <Custom Action='CA_UninstallWarning' Before='FindRelatedProducts'>NOT UPGRADINGPRODUCTCODE AND REMOVE~="ALL"</Custom>
    ...
</InstallExecuteSequence>

Et dans mon action personnalisée, j'ai

[CustomAction]
public static ActionResult UninstallWarning(Session session)
{
    session.Log("Begin UninstallWarning.");

    Record record = new Record();
    record.FormatString = session["WarningText"];

    MessageResult msgRes = session.Message(InstallMessage.Warning | (InstallMessage)System.Windows.Forms.MessageBoxButtons.OKCancel, record);

    session.Log("End UninstallWarning.");

    if (msgRes == MessageResult.OK)
    {
        return ActionResult.Success;
    }

    return ActionResult.Failure;
}

Dans votre cas, vous pouvez utiliser messageboxbuttons.YesNo au lieu de OKCancel.

Avec return="check" dans votre action personnalisée, l'installation s'arrêtera si vous renvoyez ActionResult.Failure de l'action personnalisée.

Cette désinstallation est lancée à partir d'un bootstrapper wix mais le comportement devrait être le même.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X