2008-10-08 5 views
2

J'ai un bogue étrange avec WPF Interop et un Addin Excel. J'utilise .Net 3.5 SP1.WPF ComboBox ne reste pas ouvert lorsqu'il est utilisé dans un volet des tâches

J'utilise Add-in Express pour créer un volet de tâches personnalisé pour Excel 2003. Dans cette tâche, j'utilise ElementHost pour héberger un UserControl WPF. UserControl contient simplement une grille avec un TextBox et un ComboBox. Mon problème est le suivant: bien que tout s'affiche correctement, la ComboBox ne reste pas affichée à moins que je ne la maintienne sur la flèche descendante.

Je ne crois pas que cela soit nécessairement lié à Add-in Express parce que j'ai eu un problème similaire lorsque j'ai essayé d'afficher une fenêtre WPF de manière modélisée dans Excel.

Un deuxième problème est que le ComboBox semble réticent à abandonner le focus. Si je clique dessus, la zone de texte devient grise pour indiquer qu'elle a le focus, mais je ne peux pas déplacer le focus ailleurs dans la fenêtre. La seule façon d'arracher le focus est de déplacer la molette de la souris.

Quelqu'un d'autre a eu un problème similaire et a réussi à le réparer?

Répondre

4

Add-in Express s'est penché là-dessus pour moi, et il s'avère que cela a quelque chose à voir avec le style de fenêtre du volet des tâches qui est ajouté à Excel. Si vous désactivez l'indicateur WS_CHILD dans Windows CreateParams, les zones de liste déroulante et les autres fenêtres contextuelles fonctionnent comme prévu.

Ils m'a donné ce bout de code à ajouter à mon ADXExcelTaskPane:

private const uint WS_CHILD = 0x40000000; 
private const uint WS_CLIPCHILDREN = 0x02000000; 
private const uint WS_CLIPSIBLINGS = 0x04000000; 

private CreateParams _CreateParams = new CreateParams(); 
protected override CreateParams CreateParams 
{ 
    get 
    { 
     _CreateParams = base.CreateParams; 
     if (!DesignMode) 
      _CreateParams.Style = (int)(WS_CLIPCHILDREN | WS_CLIPSIBLINGS); //| WS_CHILD 

     return _CreateParams; 
    } 
} 
+0

Je ne l'ai pas Ajouter express, une idée quelle fenêtre est le volet personnalisé (spy ++ suggère la fenêtre 'EXCEL2'). Et comment remplacer son style dans ce cas? –

0

J'ai eu le même problème. J'ai un contrôle utilisateur WPF hébergé dans un contrôle utilisateur WinForm et le tout est un AddIn Excel. Je travaille avec Visual Studio 2010 et Excel 2007 et Excel 2010.

Mon problème était que lorsque je cliquais une fois dans la feuille Excel, l'AddIn ne gagne plus le focus. J'ai trouvé une solution de contournement.

  1. Dans le constructeur de mon contrôle utilisateur WinForm, je m'inscris sur l'événement MouseEnter de mon contrôle utilisateur WPF.
  2. Dans le gestionnaire d'événements MouseEnter, je donne le focus à moi-même (this.Focus())

    public WpfContainerUserControl() 
    { 
        InitializeComponent(); 
        GpecsBrowserTabUserControl gpecBrowser = elementHost1.Child as GpecsBrowserTabUserControl; 
        gpecBrowser.MouseEnter += new System.Windows.Input.MouseEventHandler(gpecBrowser_MouseEnter); 
    } 
    
    void gpecBrowser_MouseEnter(object sender, System.Windows.Input.MouseEventArgs e) 
    { 
        this.Focus(); 
    } 
    
Questions connexes