2010-01-24 6 views
0

Supposons que j'affiche un bitmap et que je souhaite autoriser le texte à être placé sur ce bitmap. Je peux afficher un contrôle RichEdit ou TextBox à l'emplacement et permettre au texte d'être tapé à une certaine police/taille etc ... mais alors l'utilisateur peut "voir" le contrôle d'entrée de texte rectangulaire apparaître et disparaître lors de l'entrée/modifier et l'édition annule. Il couvre également le bitmap tout en entrant/éditant le texte. Ma question est, comment est-ce fait de telle sorte que la fenêtre de contrôle d'entrée de texte est "transparent" ou non "visible".Entrée de texte graphique .NET

Encore une fois, s'il y a du texte sur le bitmap, l'utilisateur clique sur le texte et viole le caret apparaît dans le texte, sans afficher un contrôle rectangulaire visible comme zone de texte, richedit etc ..., le texte juste " magiquement "devient modifiable.

Y at-il un moyen de faire cette entrée de texte "fond transparent" dans .NET?

Répondre

0

Un peu d'options viennent à l'esprit:

  • Il ne peut pas être une mauvaise chose à montrer une zone de saisie de texte. Cela permet à l'utilisateur d'avoir cliqué sur l'image bitmap pour entrer dans un nouveau «mode» et pouvoir saisir du texte. Cela est cohérent avec la modification des noms d'éléments dans une arborescence ou la modification d'un nom de fichier dans un explorateur de fichiers Windows, par exemple. TextBox prend en charge BorderStyle.None, mais ne permet pas un arrière-plan transparent (probablement parce qu'il devrait préserver l'arrière-plan pendant les opérations d'édition). Il est facile de faire un essai pour voir si cela fonctionne assez bien pour vos besoins.

  • Il serait très facile d'écrire précisément le comportement souhaité sur votre écran, c'est-à-dire de se passer entièrement de contrôles tiers. Vous n'avez qu'à rendre le texte, et pendant l'édition, ajoutez l'affichage du curseur (c'est-à-dire tracez une ligne simple à la position d'insertion) et manipulez les touches pour ajouter ou supprimer du texte à la position du curseur. Il suffit de séparer le rendu du texte et de l'arrière-plan afin de pouvoir le restituer à mesure que le texte est modifié.

+0

Quelques pensées intéressantes. Merci Jason. –

0

La méthode la plus simple consiste à utiliser le contrôle TextBox de WPF. Vous pouvez facilement définir l'arrière-plan transparent:

<TextBox Text="{Binding MyProperty}" Background="Transparent" /> 

Pour rendre transparente toute la zone de texte à l'exception de son contenu, il suffit d'utiliser un ControlTemplate:

<TextBox Text="{Binding MyProperty}"> 
    <TextBox.Template> 

    <ControlTemplate> 
     <ScrollViewer Name="PART_ContentHost" /> 
    </ControlTemplate> 

    </TextBox.Template> 
</TextBox> 

Si vous utilisez toujours WinForms il est beaucoup plus difficile. Vous disposez de trois options:

  • Il semble que le type d'application que vous faites est déjà un grand candidat WPF donc je passe à certainement WPF si vous n'êtes pas trop loin en elle. En plus des zones de texte transparentes, WPF a de nombreux autres avantages par rapport à WinForms qui peuvent considérablement améliorer la productivité de votre développeur, comme la liaison de données avancée et la modélisation. Si vous êtes bloqué avec WinForms mais pouvez restituer la zone derrière la zone de texte dans WPF, utilisez un WPF ElementHost pour afficher cette section entière de l'interface utilisateur à l'aide de WPF et laissez le reste de votre code sous WinForms. Sinon, écrire votre propre contrôle de remplacement TextBox est probablement ce que vous pouvez faire de mieux.

0

Une façon serait de créer un nouveau contrôle utilisateur en héritant de TextBox puis redéfinissant la méthode OnPaint? J'utiliserais .NET Reflector pour voir ce qui se passe dans la méthode originale et essayer de comprendre comment rendre le texte sans l'arrière-plan/cadre.