IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Windows Presentation Foundation Discussion :

[C#][WPF] Rendre un UserControl WPF utilisable depuis COM


Sujet :

Windows Presentation Foundation

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    1 002
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 1 002
    Points : 552
    Points
    552
    Par défaut [C#][WPF] Rendre un UserControl WPF utilisable depuis COM
    Bonjour,

    J'ai un pti souci, j'ai besoin d'utiliser du WPF depuis du COM (je réalise un add-in word, qui utilise une factory initialisant un composant COM)

    J'ai d'abord réalisé un UserControl simple en WinForm, et ca marche:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    namespace MyNameSpace
    {
        [ProgId("MyNameSpace.MyUC")]
        [Guid("A1DC8CCB-6AC3-4922-BC16-E8485C003E13")]
        [ComVisible(true)]
        public partial class MyUC: UserControl
        {
     
     
            public MyUC()
            {
                InitializeComponent();
            }
     
            ///	<summary>
            ///	Register the class as a	control	and	set	it's CodeBase entry
            ///	</summary>
            ///	<param name="key">The registry key of the control</param>
            [ComRegisterFunction()]
            public static void RegisterClass(string key)
            {
                StringBuilder sb = new StringBuilder(key);
                sb.Replace(@"HKEY_CLASSES_ROOT\", "");
                RegistryKey k = Registry.ClassesRoot.OpenSubKey(sb.ToString(), true);
                RegistryKey ctrl = k.CreateSubKey("Control");
                ctrl.Close();
                RegistryKey inprocServer32 = k.OpenSubKey("InprocServer32", true);
                inprocServer32.SetValue("CodeBase", Assembly.GetExecutingAssembly().CodeBase);
                inprocServer32.Close();
                k.Close();
            }
     
            ///	<summary>
            ///	Called to unregister the control
            ///	</summary>
            ///	<param name="key">Tke registry key</param>
            [ComUnregisterFunction()]
            public static void UnregisterClass(string key)
            {
                StringBuilder sb = new StringBuilder(key);
                sb.Replace(@"HKEY_CLASSES_ROOT\", "");
                RegistryKey k = Registry.ClassesRoot.OpenSubKey(sb.ToString(), true);
                k.DeleteSubKey("Control", false);
                k.OpenSubKey("InprocServer32", true);
                k.DeleteSubKey("CodeBase", false);
                k.Close();
            }
        }
    }
    Ce code marche


    seulement pour un UserControl écrit en WPF: (c'est le meme code ou presque )
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    namespace MyNameSpace
    {
        /// <summary>
        /// Logique d'interaction pour MainUC.xaml
        /// </summary>
        [Guid("40B453FD-63CC-46FB-97DA-13828191071C")]
        [ProgId("MyNameSpace.MyUC")]
        [ClassInterface(ClassInterfaceType.None)]
        [ComVisible(true)]
        public partial class MyUC : UserControl
        {
            public MyUC()
            {
                InitializeComponent();
            }
     
     
     
            ///	<summary>
            ///	Register the class as a	control	and	set	it's CodeBase entry
            ///	</summary>
            ///	<param name="key">The registry key of the control</param>
            [ComRegisterFunction()]
            public static void RegisterClass(string key)
            {
                StringBuilder sb = new StringBuilder(key);
                sb.Replace(@"HKEY_CLASSES_ROOT\", "");
                RegistryKey k = Registry.ClassesRoot.OpenSubKey(sb.ToString(), true);
                RegistryKey ctrl = k.CreateSubKey("Control");
                ctrl.Close();
                RegistryKey inprocServer32 = k.OpenSubKey("InprocServer32", true);
                inprocServer32.SetValue("CodeBase", Assembly.GetExecutingAssembly().CodeBase);
                inprocServer32.Close();
                k.Close();
            }
     
            ///	<summary>
            ///	Called to unregister the control
            ///	</summary>
            ///	<param name="key">Tke registry key</param>
            [ComUnregisterFunction()]
            public static void UnregisterClass(string key)
            {
                StringBuilder sb = new StringBuilder(key);
                sb.Replace(@"HKEY_CLASSES_ROOT\", "");
                RegistryKey k = Registry.ClassesRoot.OpenSubKey(sb.ToString(), true);
                k.DeleteSubKey("Control", false);
                k.OpenSubKey("InprocServer32", true);
                k.DeleteSubKey("CodeBase", false);
                k.Close();
            }
        }
    }

    Cela ne marche pu dutout... (je n'ai pas réussi à capter l'erreur mais j'essayerai de la poster quand même héhé..)

    Voila...

    Bon l'astuce pour le moment c'est de docker mon UserControl fait en WPF dans mon UserControl WinForm, et d'appeler dans ma factory le UserControl WinForm....

    Mais bon c'est un peu moyen quoi...

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    1 002
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 1 002
    Points : 552
    Points
    552
    Par défaut
    Au sujet de l'erreur que je me mange avec le composant WPF/COM:
    System.Runtime.Interop.Services.COMException (0x800004005): Impossible de créer le controle ActiveX spécifié.
    à Microsoft.Office.Core.ICFactory.CreateCTP(String CTPAxID, String CTPTitle, Object CTPParentWindow)
    Il est bien dans regedit pourtant (classroot)

  3. #3
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    Un contrôle WPF n'est pas un contrôle Win32, donc tu ne peux pas l'intégrer comme ça dans un add-in Word. Tu pourrais essayer de faire un contrôle WinForms qui hérite de ElementHost, dans lequel tu mets ton contrôle WPF. Et dans l'add-in Word, tu utilises le contrôle hérité de ElementHost. Je garantis pas le résultat, mais c'est une piste à explorer...

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    1 002
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 1 002
    Points : 552
    Points
    552
    Par défaut
    tomlev
    Ok je te remercie pour ta réponse !

    Donc je vais garder mon astuce de docker mon usercontrol wpf dans un usercontrol winform comVisible

    C'est ce qui me parait plus simple à réaliser

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [VS2008] Gros handicap du concepteur WPF avec les UserControl
    Par Obligen dans le forum Windows Presentation Foundation
    Réponses: 12
    Dernier message: 04/05/2009, 16h23
  2. Afficher un composant Winform dans WPF (en passant par un UserControl(WPF))
    Par karim.user dans le forum Windows Presentation Foundation
    Réponses: 17
    Dernier message: 21/04/2009, 13h00
  3. Insertion de UserControl WPF dans Office
    Par s.o.f dans le forum Windows Presentation Foundation
    Réponses: 2
    Dernier message: 26/05/2008, 14h23
  4. Réponses: 3
    Dernier message: 05/02/2008, 15h19
  5. Réponses: 12
    Dernier message: 19/06/2007, 10h24

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo