2010-08-19 4 views

Répondre

1

WPF ne pas utiliser les poignées Win32 pour les contrôles individuels comme TextBox, uniquement pour la fenêtre elle-même. En d'autres termes, du point de vue de Win32 l'ensemble de l'objet fenêtre WPF est une seule fenêtre avec un seul handle. Pour cette raison, il est inutile pour une fenêtre IWin32 de renvoyer le handle Win32 "réel" d'une zone de texte WPF: Une zone de texte WPF n'a tout simplement pas un descripteurs Win32. Ainsi, vous devrez renvoyer un handle Win32 d'un autre objet.

Comment faire cela dépend de ce que vous utiliserez pour la IWin32Window. Il existe plusieurs possibilités pour la création d'une fenêtre Win32 pour correspondre à votre TextBox:

  1. Vous pouvez créer une fenêtre Win32 transparente qui chevauche la zone de texte (utile pour les essais de succès ou scénarios surétirage)
  2. Vous pouvez créer un zéro -size fenêtre qui est centrée sur le TextBox (utile pour l'emplacement initial de la boîte de dialogue et les scénarios de propriété)
  3. Vous pouvez héberger le TextBox dans un ElementHost plutôt que dans une fenêtre WPF (utile si vous souhaitez que le TextBox s'intègre avec d'autres Win32 (par exemple, une ancienne application MFC)
  4. Vous pouvez héberger la zone de texte dans un élémentHôte à l'intérieur un WindowsFormsHost (utile si vous avez besoin d'une fenêtre Win32 autour de la zone de texte mais ont encore besoin WPF mise en page

Notes sur les solutions « fenêtre supplémentaire » (1 & 2)

Pour créer une fenêtre Win32 superpositions le TextBox (transparent ou de taille nulle), vous utiliseriez les techniques traditionnelles Win32 ou WinForms.

Étant donné que le TextBox peut se déplacer sur l'écran, vous devez déplacer la fenêtre Win32 à chaque fois que le TextBox se déplace. Cela peut être fait dans l'événement OnRendering en utilisant textBox.TransformToAncestor (fenêtre) puis en transformant en coordonnées de périphérique en utilisant PresentationSource.TransformToDevice.

Notes sur des solutions ElementHost (3 & 4)

C'est aussi simple que enveloppant le ElementHost autour de la zone de texte dans votre XAML, donc ceci:

<Grid> 
    ... 
    <TextBox ...> 
</Grid> 

devenions:

<Grid> 
    ... 
    <WindowsFormsHost> 
    <ElementHost> 
     <TextBox ...> 
    </ElementHost> 
    </WindowsFormsHost> 
</Grid> 

Cela peut également être fait dans le code en supprimant le TextBox de son parent, en l'ajoutant à un ElementHost nouvellement créé, puis en ajoutant ElementHost à un WindowsFormsHost nouvellement créé et en ajoutant le WindowsFormsHost au parent. Notez que les styles et propriétés WPF (y compris DataContext, propriétés TextElement, etc.) ne se propagent pas dans ElementHost, même s'ils sont enveloppés dans un WindowsFormsHost. Les paramètres et ressources souhaités doivent donc être propagés manuellement.