2009-08-27 18 views
2

本当に原油のソリューションでハッキングを開始する前に、誰かが私に正しい方向に少しでも軽快させることができるかどうかを知りたいと思った。WPF RichTextBox - 選択したテキストをカスタムコントロールに置き換えよう

私が本当にやりたいことは、ユーザーがリッチテキストボックス内のテキストを選択し、ボタンをクリックし、そのテキストをカスタムレンダリングコントロールに変換させることです。たとえば、選択したテキストを含むButtonに変換します。

答えて

2

コマンドとCommandParameterでこれを行うことができます

まず、のように、ICommandのにボタンをバインドします。その後、あなたのViewModelまたはコントローラまたはコードビハインドまたはどこに、あなたが公開

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

財産としてのICommand、および方法を指すように...

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 
} 

注作業などを行うには:私はジョシュ・スミスの優れたからRelayCommandを使用していましたを使用することもできますが、たとえばRoutedUICommandを同じように使用することもできます(入力ジェスチャをコマンドに関連付けるという特別な利点が追加されます)

+0

残念ながら、RTBコントロールのSelection.Pathにバインドできませんでしたが、パス=選択を設定すると私のRelayCommand型System.Windows.Documents.TextSelectionを作成して(同じ型のパラメータを取るようにしてください)、それは正常に動作します。 私が言っていることを示すために上のコードを更新します:) – kiwipom

0

選択を受け取り、InlineUIContainerでラップするコードを書く必要がありますリッチテキストボックス内でコントロールを取得する方法は次のとおりです。

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

ねえロブ:)ああ、それは実際に* RichTextBoxのコントロールがほしいかもしれない私には決して起こったことはありません...素敵な答え:) – kiwipom

+0

私は私の質問で十分に明確ではなかったと思います。これは明らかにXAMLでは些細なことですが、ここで示した結果のドキュメントには、 "FooBar"を含むが1つしかないときに、ユーザーが「oB」を選択してプログラムからプログラムを作成する方法がありました。 –

+0

@IanR ありがとう、非常に便利です! – msfanboy

関連する問題