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>