WPF RichTextBox - 用自定义控件替换所选文本

时间:2009-08-27 05:05:48

标签: wpf richtextbox selectedtext

在我开始讨论一个非常粗糙的解决方案之前,我想我会看到是否有人可以在正确的方向上给我一些推动。

我真正想要做的是让用户在RichTextBox中选择一些文本,单击一个按钮,然后将该文本转换为自定义渲染控件。例如,将其转换为包含所选文本的按钮。

2 个答案:

答案 0 :(得分:2)

您可以使用Command和CommandParameter执行此操作

首先,将按钮绑定到ICommand,例如:

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

然后在ViewModel或Controller或Code-behind或任何地方,将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(这会增加额外的好处,让你将输入手势与你的命令联系起来)

答案 1 :(得分:0)

您需要编写一些代码,将您的选择包装在InlineUIContainer中 - 这就是您在富文本框中获取控件的方式:

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