2009-08-27 11 views
2

Avant de commencer à pirater une solution vraiment grossière, je pensais voir si quelqu'un pouvait me donner un petit coup de pouce dans la bonne direction. Ce que je veux vraiment faire est de laisser un utilisateur sélectionner du texte dans un RichTextBox, cliquer sur un bouton, et convertir ce texte en un contrôle rendu personnalisé. Convertissez-le en un bouton contenant le texte qu'ils ont sélectionné, par exemple.WPF RichTextBox - Remplacer le texte sélectionné par un contrôle personnalisé

Répondre

2

Vous pouvez le faire avec commande et CommandParameter

D'abord, lier le bouton à un ICommand, comme:

<Button Content="Go" Command="{Binding MyCommand}" CommandParameter="{Binding ElementName=myRichTextBox, Path=Selection}" /> 
<RichTextBox Name="myRichTextBox" /> 

Ensuite, dans votre ViewModel ou contrôleur ou code-behind ou ailleurs, vous exposez la ICommand comme une propriété, et le pointer vers une méthode pour faire le travail, comme ...

public ICommand MyCommand 
{ 
    get 
    { 
     if (_queryCommand == null) 
     { 
      _queryCommand = new RelayCommand<TextSelection>(DoWork); 
     } 
     return _queryCommand; 
    } 
} 

private void DoWork(TextSelection param) 
{ 
    string selectedText = param.Text; 

    // Build your control here... 
    // probably put it in an ObservableCollection<Control> which is bound by an Items Control, like a ListBox 
} 

note: J'ai utilisé le RelayCommand de Josh Smith excellente MVVM Foundation, mais vous pouvez également utiliser un RoutedUICommand par exemple (ce qui ajouterait l'avantage de vous permettre d'associer des gestes d'entrée à votre commande)

+0

Désolé, comme un ajout ... J'ai juste essayé et a échoué à se lier à la Selection.Path du contrôle RTB, mais si je pavent la voie = Sélection , et faites ma commande RelayCommand de type System.Windows.Documents.TextSelection (et faites en sorte que mon gestionnaire prenne un paramètre du même type) cela fonctionne bien ... Je mettrai à jour le code ci-dessus pour vous montrer ce que je veux dire :) – kiwipom

0

Vous aurez besoin d'écrire du code qui prendra votre sélection et l'enrobera dans un InlineUIContainer - voilà comment vous obtenez des contrôles dans une zone de texte riche:

<RichTextBox> 
    <FlowDocument> 
     <Paragraph> 
      <Run>Fo</Run> 
      <InlineUIContainer> 
       <Button IsEnabled="True">oB</Button> 
      </InlineUIContainer> 
      <Run>ar</Run> 
     </Paragraph> 
    </FlowDocument> 
</RichTextBox> 
+0

Hey Rob :) Huh .. il ne m'est jamais venu à l'esprit qu'il pourrait vouloir le contrôle * dans * la RichTextBox ... belle réponse :) – kiwipom

+0

Je suppose que je n'étais pas assez clair sur ma question. Ceci est évidemment trivial dans XAML, mais ma question était de savoir comment programmer par l'utilisateur en sélectionnant 'oB' quand il n'y en a qu'un contenant "FooBar", au document résultant que vous avez montré ici. –

+0

@IanR merci, très utile! – msfanboy

Questions connexes