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

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

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

Ответы [ 2 ]

2 голосов
/ 27 августа 2009

Вы можете сделать это с помощью 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, например (что добавило бы дополнительное преимущество, позволяющее вам связывать входные жесты с вашей командой)

0 голосов
/ 27 августа 2009

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

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