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
。
这是一个简单的文本框模板,只有文本编辑部分
所以设置IsReadOnly="True"会使它像ContentPresenter一样否则它就像文本框一样可编辑
<TextBox Text="edit me">
<TextBox.Template>
<ControlTemplate TargetType="TextBox">
<ScrollViewer x:Name="PART_ContentHost" />
</ControlTemplate>
</TextBox.Template>
</TextBox>
您可以根据需要自定义