非常に大雑把な解決策のハッキングを始める前に、誰かが正しい方向に向けてちょっとしたコツを教えてくれるかどうか見てみようと思いました。
私が実際にやりたいことは、ユーザーが RichTextBox 内のテキストを選択し、ボタンをクリックして、そのテキストをレンダリングされたカスタム コントロールに変換できるようにすることです。たとえば、選択したテキストを含むボタンに変換します。
非常に大雑把な解決策のハッキングを始める前に、誰かが正しい方向に向けてちょっとしたコツを教えてくれるかどうか見てみようと思いました。
私が実際にやりたいことは、ユーザーが RichTextBox 内のテキストを選択し、ボタンをクリックして、そのテキストをレンダリングされたカスタム コントロールに変換できるようにすることです。たとえば、選択したテキストを含むボタンに変換します。
Command と CommandParameter でこれを行うことができます
まず、次のようにボタンを ICommand にバインドします。
<Button Content="Go" Command="{Binding MyCommand}" CommandParameter="{Binding ElementName=myRichTextBox, Path=Selection}" />
<RichTextBox Name="myRichTextBox" />
次に、ViewModel、Controller、コード ビハインド、またはどこでも、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
}
注: Josh Smith の優れたMVVM Foundationの RelayCommand を使用しましたが、たとえば RoutedUICommand を同様に使用することもできます (これにより、入力ジェスチャーをコマンドに関連付けることができるという利点が追加されます)。
選択内容を受け取り、それを InlineUIContainer にラップするコードを記述する必要があります。これが、リッチ テキスト ボックス内にコントロールを取得する方法です。
<RichTextBox>
<FlowDocument>
<Paragraph>
<Run>Fo</Run>
<InlineUIContainer>
<Button IsEnabled="True">oB</Button>
</InlineUIContainer>
<Run>ar</Run>
</Paragraph>
</FlowDocument>
</RichTextBox>