【发布时间】:2011-08-09 22:47:48
【问题描述】:
在我开始破解一个非常粗略的解决方案之前,我想看看是否有人可以在正确的方向上给我一点提示。
我真正想做的是让用户在 RichTextBox 中选择一些文本,单击一个按钮,然后将该文本转换为自定义呈现的控件。例如,将其转换为包含他们选择的文本的 Button。
【问题讨论】:
标签: wpf richtextbox selectedtext
在我开始破解一个非常粗略的解决方案之前,我想看看是否有人可以在正确的方向上给我一点提示。
我真正想做的是让用户在 RichTextBox 中选择一些文本,单击一个按钮,然后将该文本转换为自定义呈现的控件。例如,将其转换为包含他们选择的文本的 Button。
【问题讨论】:
标签: wpf richtextbox selectedtext
您可以使用 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(这将增加让您将输入手势与命令相关联的额外好处)
【讨论】:
您需要编写一些代码来获取您的选择并将其包装在 InlineUIContainer 中 - 这就是您在富文本框中获取控件的方式:
<RichTextBox>
<FlowDocument>
<Paragraph>
<Run>Fo</Run>
<InlineUIContainer>
<Button IsEnabled="True">oB</Button>
</InlineUIContainer>
<Run>ar</Run>
</Paragraph>
</FlowDocument>
</RichTextBox>
【讨论】: