wpf - 键入时组合框换行

标签 wpf combobox word-wrap

好吧,我完全被这个难住了。我的 WPF 项目中有一个 ComboBox,它有 IsEditable设置为真。用户可以从下拉列表中选择一个选项或输入他们喜欢的内容。

如果用户键入或从下拉列表中选择一个选项,我该如何使文本换行?

任何指针?

非常感谢

最佳答案

组合框使用文本框来显示内容..您可以覆盖它的模板,只需将“TextWrapping=Wrap”添加到“PART_EditableTextbox”文本框:

<ControlTemplate x:Key="ComboBoxEditableTemplate" TargetType="{x:Type ComboBox}">
    <Grid SnapsToDevicePixels="true">
        <Border x:Name="Bd"
                Background="{TemplateBinding Background}"
                BorderBrush="{TemplateBinding BorderBrush}"
                BorderThickness="{TemplateBinding BorderThickness}"
                Padding="1">
            <Grid Grid.IsSharedSizeScope="true">
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="1" />
                    <ColumnDefinition Width="*" />
                    <ColumnDefinition Width="Auto" SharedSizeGroup="ComboBoxButton" />
                </Grid.ColumnDefinitions>
                <TextBox x:Name="PART_EditableTextBox"
                            Grid.Column="1"
                            Margin="{TemplateBinding Padding}"
                            HorizontalContentAlignment="{TemplateBinding HorizontalContentAlignment}"
                            VerticalContentAlignment="{TemplateBinding VerticalContentAlignment}"
                            IsReadOnly="{Binding IsReadOnly, RelativeSource={RelativeSource TemplatedParent}}"
                            TextWrapping="Wrap"
                            Style="{StaticResource ComboBoxEditableTextBox}" />
                <ToggleButton Grid.ColumnSpan="3"
                                Background="{x:Null}"
                                IsChecked="{Binding IsDropDownOpen, Mode=TwoWay, RelativeSource={RelativeSource TemplatedParent}}"
                                Style="{StaticResource ComboBoxTransparentButtonStyle}" />
            </Grid>
        </Border>
        <Popup x:Name="PART_Popup"
                AllowsTransparency="true"
                Focusable="false"
                IsOpen="{Binding IsDropDownOpen, RelativeSource={RelativeSource TemplatedParent}}"
                Placement="Bottom"
                PopupAnimation="{DynamicResource {x:Static SystemParameters.ComboBoxPopupAnimationKey}}">
            <Microsoft_Windows_Themes:SystemDropShadowChrome x:Name="Shdw"
                                                                MinWidth="{TemplateBinding ActualWidth}"
                                                                MaxHeight="{TemplateBinding MaxDropDownHeight}"
                                                                Color="Transparent">
                <Border x:Name="DropDownBorder"
                        Background="{DynamicResource {x:Static SystemColors.WindowBrushKey}}"
                        BorderBrush="{DynamicResource {x:Static SystemColors.WindowFrameBrushKey}}"
                        BorderThickness="1">
                    <ScrollViewer x:Name="DropDownScrollViewer">
                        <Grid RenderOptions.ClearTypeHint="Enabled">
                            <Canvas Width="0"
                                    Height="0"
                                    HorizontalAlignment="Left"
                                    VerticalAlignment="Top">
                                <Rectangle x:Name="OpaqueRect"
                                            Width="{Binding ActualWidth, ElementName=DropDownBorder}"
                                            Height="{Binding ActualHeight, ElementName=DropDownBorder}"
                                            Fill="{Binding Background, ElementName=DropDownBorder}" />
                            </Canvas>
                            <ItemsPresenter x:Name="ItemsPresenter"
                                            KeyboardNavigation.DirectionalNavigation="Contained"
                                            SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" />
                        </Grid>
                    </ScrollViewer>
                </Border>
            </Microsoft_Windows_Themes:SystemDropShadowChrome>
        </Popup>
    </Grid>
    <ControlTemplate.Triggers>
        <Trigger Property="HasItems" Value="false">
            <Setter TargetName="DropDownBorder" Property="MinHeight" Value="95" />
        </Trigger>
        <Trigger Property="IsEnabled" Value="false">
            <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.GrayTextBrushKey}}" />
            <Setter TargetName="Bd" Property="Background" Value="{DynamicResource {x:Static SystemColors.ControlBrushKey}}" />
        </Trigger>
        <Trigger Property="IsGrouping" Value="true">
            <Setter Property="ScrollViewer.CanContentScroll" Value="false" />
        </Trigger>
        <Trigger SourceName="PART_Popup" Property="HasDropShadow" Value="true">
            <Setter TargetName="Shdw" Property="Margin" Value="0,0,5,5" />
            <Setter TargetName="Shdw" Property="Color" Value="#71000000" />
        </Trigger>
        <Trigger SourceName="DropDownScrollViewer" Property="ScrollViewer.CanContentScroll" Value="false">
            <Setter TargetName="OpaqueRect" Property="Canvas.Top" Value="{Binding VerticalOffset, ElementName=DropDownScrollViewer}" />
            <Setter TargetName="OpaqueRect" Property="Canvas.Left" Value="{Binding HorizontalOffset, ElementName=DropDownScrollViewer}" />
        </Trigger>
    </ControlTemplate.Triggers>
</ControlTemplate>

关于wpf - 键入时组合框换行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7994552/

相关文章:

javascript - HTML:当由 JavaScript 设置时,为什么 Firefox 不使用 wrap ="off"?

wpf - MVVM 和自定义控件?

javascript - jQueryUI 自动选择组合框事件未触发

c# - 将字体高度设置为文本 block 高度的一半

python - TK 中不存在 ComboBox

javascript - Slickgrid Combobox如何实现值显示类型绑定(bind)

C# - 我如何包装静态类

eclipse - 如何在 Aptana Studio 的文本编辑器中激活自动换行?

c# - 使用 ItemsSource 填充 WPF ListBox - 好主意?

c# - 在 WPF 中使用 CollectionView 时无法从数据集中的连接表中获取数据