WPF RichTextBox - заменить выделенный текст пользовательским элементом управления

Перед тем, как начать взламывать действительно грубое решение, я подумал, что увижу, может ли кто-нибудь слегка подтолкнуть меня в правильном направлении.

Что я действительно хочу сделать, так это позволить пользователю выбрать какой-либо текст в RichTextBox, нажать кнопку и преобразовать этот текст в пользовательский элемент управления. Преобразуйте его, например, в кнопку, содержащую выбранный текст.

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
}

Примечание: я использовал RelayCommand от превосходного MVVM Foundation Джоша Смита, но вы могли бы в равной степени использовать, например, RoutedUICommand (что добавило бы дополнительное преимущество, позволяя вам связывать входные жесты с вашей командой)

Вам нужно написать некоторый код, который берет ваш выбор и оборачивает его в InlineUIContainer - так вы получаете элементы управления внутри расширенного текстового поля:

<RichTextBox>
    <FlowDocument>
        <Paragraph>
            <Run>Fo</Run>
            <InlineUIContainer>
                <Button IsEnabled="True">oB</Button>
            </InlineUIContainer>
            <Run>ar</Run>
        </Paragraph>
    </FlowDocument>
</RichTextBox>
Другие вопросы по тегам