【问题标题】:WPF RichTextBox - Replace Selected Text with Custom ControlWPF RichTextBox - 用自定义控件替换选定的文本
【发布时间】:2011-08-09 22:47:48
【问题描述】:

在我开始破解一个非常粗略的解决方案之前,我想看看是否有人可以在正确的方向上给我一点提示。

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

【问题讨论】:

    标签: wpf richtextbox selectedtext


    【解决方案1】:

    您可以使用 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(这将增加让您将输入手势与命令相关联的额外好处)

    【讨论】:

    • 对不起,作为补充...我刚刚尝试绑定到 RTB 控件的 Selection.Path 并失败,但如果我设置 Path=Selection,并设置我的 RelayCommand 类型为 System.Windows .Documents.TextSelection (并使我的处理程序采用相同类型的参数)它工作正常...我将更新上面的代码以向您展示我的意思:)
    【解决方案2】:

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

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

    【讨论】:

    • Hey Rob :) Huh.. 我从来没有想过他可能真的想要控件 in RichTextBox...很好的答案 :)
    • 我想我的问题还不够清楚。这在 XAML 中显然是微不足道的,但我的问题是当只有一个包含“FooBar”的 时,如何以编程方式从用户选择“oB”到您在此处显示的结果文档。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-29
    • 1970-01-01
    相关资源
    最近更新 更多