2010-07-20 3 views
3

Je travaille avec un FlowDocument dans un WPF RichTextBox. Certains des éléments de document de flux sont créés à l'aide de sous-classes des classes de structure System.Windows.Documents et tous les éléments utilisent la propriété Tag pour stocker des données supplémentaires.Perte de données pendant les opérations du Presse-papiers WPF

Si j'utilise un XamlWriter pour sérialiser un arbre de documents, tout est correctement reflétée dans la sortie Xaml résultant.

Cependant, si je simplement copier et coller dans le RichTextBox, bien que les éléments collés soient visuellement identiques à ceux à partir de laquelle ils ont été copiés, l'opération du presse-papiers supprime toutes mes données supplémentaires. Plus précisément, tous les éléments sous-classés sont collés en tant qu'instances de leurs types de structure de base et aucun d'entre eux n'a de données dans leur propriété Tag. Cela suggère qu'une opération de presse-papiers WPF sur un RichTextBox n'utilise pas XamlWriter pour la sérialisation, malgré le fait que les données du Presse-papiers sérialisé identifient son format comme "Xaml".

J'imagine que la raison de ce comportement est d'assurer un dénominateur commun lors du collage dans d'autres applications compatibles avec Xaml qui ne possèdent pas nécessairement la connaissance de mes types personnalisés. Mais j'ai besoin de mettre en œuvre un mécanisme de copier/coller plus riche à utiliser dans mon application.

Je suppose que je peux probablement intercepter l'événement de copie et ajouter des données de presse-papiers dans un format personnalisé, qui est ensuite appliqué dans l'événement de collage. Cependant, ceci présente ses propres complications, car les éléments peuvent avoir besoin d'être enveloppés avant de coller (par exemple des éléments en ligne qui sont collés dans un contexte d'élément de bloc). Par conséquent, j'espère éviter de réinventer la roue et j'apprécierais tout conseil sur la façon de le faire fonctionner en utilisant l'infrastructure du cadre existant.

Répondre

0

Je n'ai pas de réponse exacte à votre question, mais je peux penser à deux façons de procéder avec -

  1. associé un CommandBinding pour opération de copier/coller, avec vos contrôles et effectuer personnalisés opérations dans Execute et CanExecute méthodes. Comme expliqué ici:

    http://msdn.microsoft.com/en-us/library/system.windows.input.commandbinding.aspx

  2. Utilisez DataObject classe pour intercepter copier/coller des événements et effectuer votre là opération personnalisée. c'est-à-dire DataObject.AddCopyingHandler et DataObject.AddPastingHandler.

    Quelques liens utiles -

    http://msdn.microsoft.com/en-us/library/system.windows.dataobject_members.aspx

    http://blogs.msdn.com/b/prajakta/archive/2006/11/28/auto-detecting-hyperlinks-in-richtextbox-part-ii.aspx

Espoir qui vous aideront.

+0

Merci pour vos idées. Bien que cela ne résolve pas complètement le problème, cela me donne l'information nécessaire pour interagir avec le presse-papiers. En outre, l'article que vous avez recommandé comprend une technique ingénieuse pour déterminer ce qui a été collé. Est-ce votre article? Si oui, merci pour ceci et vos autres tutoriels de blog. Dernière question - faites-vous du travail de consultation? Si oui, puis-je vous contacter via PM? Merci encore. –

+0

Merci Tim, même si ce n'est pas mon blog. Ya je fais du travail de consultation chaque fois que j'ai le temps. S'il vous plaît n'hésitez pas à me contacter à [email protected] – akjoshi

Questions connexes