WPF组合框的可编辑富文本

时间:2014-08-26 15:53:36

标签: wpf xaml combobox richtextbox itemtemplate

(使用VS 2010)

我的Combobox IsEditable设置为True(即,用户可以从下拉列表中选择项目,但也可以编辑所选项目的文本)。此外,我希望某些关键字能够自动加粗并且可能是彩色的。换句话说,文本将没有统一的样式。这对于所选项最重要,但如果下拉项也遵循相同的格式约定,那将是很好的。

RichTextBox似乎是实施多种文字格式的最佳选择,但我无法弄清楚如何正确实施它ComboBox {{1} }}。这就是我到目前为止所做的:

ItemTemplate

但是这种方法非常笨重,存在各种选择/聚焦/编辑问题。我还没有获得格式化关键字的代码。

有人能告诉我使用<ComboBox HorizontalAlignment="Stretch" SelectedItem="{Binding SearchText}" ItemsSource="{Binding FileHistoryItems}"> <ComboBox.ItemTemplate> <DataTemplate> <RichTextBox Width="300" > <RichTextBox.Document> <FlowDocument > <Paragraph> <TextBlock Text="{Binding}"></TextBlock> </Paragraph> </FlowDocument> </RichTextBox.Document> </RichTextBox> </DataTemplate> </ComboBox.ItemTemplate> </ComboBox> 作为可编辑组合框的正确方法吗?或者以任何方式实现项目文本可以有多种格式的RichTextBow

1 个答案:

答案 0 :(得分:1)

很遗憾,您无法通过更改控件模板“重新设置”WPF ComboBox来使用RichTextBox - 这是因为ComboBox需要TextBox的实例通过TemplatePartAttribute(您可以在此处查看组合框的默认样式和控件模板:http://msdn.microsoft.com/en-us/library/ms752094(v=vs.100).aspx)。 RichTextBox并非来自TextBox,因此您无法兑换它。

下一个问题是您无法仅更改常规TextBox中某些单词的格式 - 您只能更改整个文本的格式,但这不是您想要的方案。我只是反思了ComboBoxTextBox的.NET代码,我想说没有办法实现这一点(因为TextContainter类的重要部分是内部的)。

那你有什么选择?你可以实现自己的ComboBox,虽然这需要花费很多时间,你应该对WPF有一个非常透彻的了解 - 我不会建议这条路线。

也许最简单的方法是使用以下控件模板结构创建一个新控件:

<ControlTemplate TargetType="{x:Type l:MyComboBox}">
    <Grid>
        <ComboBox IsEditable="True">
            <ComboBox.Template>
                <ControlTemplate>
                    <!-- Default Template for ComboBox but without the TextBox and corresponding visual state changes -->
                </ControlTemplate>
            </ComboBox.Template>
        </ComboBox>
        <RichTextBox x:Name="TextHost" /> <!-- Make sure that this text box is properly aligned within ComboBox -->
    </Grid>
</ControlTemplate>

您的新控件可以从组合框派生并处理显示当前项目文本所需的所有内容,以及在用户更改文本时写回文本 - 但这也是很多工作而且不应该不容小觑。

通过这种方式,您将以某种方式封装WPF组合框。此解决方案可能仍需要几天时间才能实现,但它应该比从头开始构建组合框更快。

如果您还有其他问题,请随时提出。

相关问题