ComboBox的默认模板:IsEditable如何切换TextBox和Contentpresenter

本文关键字:何切换 TextBox Contentpresenter IsEditable 默认 ComboBox | 更新日期: 2023-09-27 18:09:22

我在WPF中使用ComboBox,但有一个行为我不理解:这里是ComboBox的默认样式/模板的链接。当IsEditable为True时,显示TextBox,用户可以输入文本进行搜索。我不太明白这一点,所以我检查了代码:

<ContentPresenter x:Name="ContentSite"
                        IsHitTestVisible="False"
                        Content="{TemplateBinding SelectionBoxItem}"
                        ContentTemplate="{TemplateBinding SelectionBoxItemTemplate}"
                        ContentTemplateSelector="{TemplateBinding ItemTemplateSelector}"
                        Margin="3,3,23,3"
                        VerticalAlignment="Stretch"
                        HorizontalAlignment="Left">
      </ContentPresenter>
      <TextBox x:Name="PART_EditableTextBox"
               Style="{x:Null}"
               Template="{StaticResource ComboBoxTextBox}"
               HorizontalAlignment="Left"
               VerticalAlignment="Bottom"
               Margin="3,3,23,3"
               Focusable="True"
               Background="Transparent"
               Visibility="Hidden"
               IsReadOnly="{TemplateBinding IsReadOnly}" />

似乎有两个视觉组件重叠,IsEditable通过设置Visibility在它们之间切换。这个链接验证:"当IsEditable等于false时,ComboBox使用ContentPresenter来显示当前选中的项目;当IsEditable等于true时,将使用TextBox代替此目的。请注意,TextBox只显示纯文本,而ComboBoxItem可能包含非纯文本内容,例如图像。"我的问题是,在TextBox中,它在哪里定义文本?Template (ComboBoxTextBox)不分配文本。我在问,因为我试图使TextBox显示与ContentPresenter相同的信息(如果可能的话)(即,当IsEditable为False时),我理解的模板绑定到我分配的Template

ComboBox的默认模板:IsEditable如何切换TextBox和Contentpresenter

这是一个简单的文本框模板,只有文本编辑部分

所以设置IsReadOnly="True"会使它像ContentPresenter一样否则它就像文本框一样可编辑

<TextBox Text="edit me">
    <TextBox.Template>
        <ControlTemplate TargetType="TextBox">
            <ScrollViewer x:Name="PART_ContentHost" />
        </ControlTemplate>
    </TextBox.Template>
</TextBox>

您可以根据需要自定义