【问题标题】:Default template for ComboBox: How does IsEditable switch TextBox and ContentpresenterComboBox的默认模板:IsEditable如何切换TextBox和Contentpresenter
【发布时间】:2014-06-19 06:26:26
【问题描述】:

我在 WPF 中使用ComboBox,但有一种行为我不明白:这是default style/template of 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 在它们之间切换。 This link 验证:“当 IsEditable 等于 false 时,ComboBox 使用 ContentPresenter 来显示当前选定的项目;当 IsEditable 等于 true 时,使用 TextBox 代替。请注意,仅 TextBox显示纯文本,并且 ComboBoxItem 可能包含非纯文本内容,例如图像。“我的问题是,在 TextBox 中,它在哪里定义文本? Template (ComboBoxTextBox) 不分配文本。我问是因为我试图让TextBox 显示与ContentPresenter 相同的信息(如果可能的话)(即,当IsEditable 为假时),我理解其模板绑定到@ 987654335@我分配。

【问题讨论】:

  • 您是否要为组合框设置下拉菜单?还是想通过模板在可编辑和只读之间切换?
  • @pushpraj 我试图让TextBox(仅在IsEditable 为True 时可见,否则ContentPreseter 如我的第二个链接所示可见)具有相同的ItemTemplate我设置。因为默认情况下,如果IsEditable 为真,则TextBox 显示,ItemTemplate 不适用于它。它使用所选项目的ToString 函数,或者如果我在ComboBox 上设置TextSearch.TextPath,则显示项目的属性(ToString)值。它们都不是我想要的,因为我希望可编辑的 TextBox 确实显示更多信息,就像我在 ItemTemplate 中定义的那样
  • @pushpraj 所以我试图了解默认模板是如何工作的,希望我能在理解时更改它。但到目前为止,我没有看到TextBox 文本的任何设置。
  • @tete 首先“文本框显示,用户可以输入文本进行搜索。”是不正确的。它只是让用户可以输入文本。您可以将 Text="{TemplateBinding ComboBox.Text}" 添加到 &lt;TextBox x:Name="PART_EditableTextBox"/&gt; ,它们具有相同的结果。所以我猜有一些默认设置。是的,只是猜测..

标签: c# .net wpf combobox


【解决方案1】:

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

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

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

您可以根据需要自定义它

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-25
    • 2018-07-16
    • 1970-01-01
    • 1970-01-01
    • 2013-12-05
    • 2013-10-01
    相关资源
    最近更新 更多