WPF ComboBox截断项

时间:2018-03-29 13:26:30

标签: c# wpf xaml mvvm combobox

将ComboBox与枚举项一起使用时,我发现了一种奇怪的行为。我注意到,单击ComboBox时显示条目的弹出窗口会截断长项目。我发现这是因为我定义了一个具有固定宽度的TextBlock样式。奇怪的是,当我使用枚举项时,宽度仅影响ComboBox。它不会发生如果我改为使用字符串。

这是一张正在发生的事情的图片。第三项应为“VeryLongTypeName”。

enter image description here

以下是根据MVVM模式编写的代码示例。

UserControl XAML:

<UserControl.DataContext>
    <local:SampleViewModel/>
</UserControl.DataContext>
<StackPanel>
    <StackPanel.Resources>
        <Style TargetType="TextBlock">
            <Setter Property="Width" Value="70"/>
            <Setter Property="Margin" Value="0,0,5,0"/>
        </Style>
    </StackPanel.Resources>
    <DockPanel>
        <TextBlock Text="Items"/>
        <ComboBox ItemsSource="{Binding ItemsList}" SelectedItem="{Binding Item}"/>
    </DockPanel>
    <DockPanel>
        <TextBlock Text="String Items"/>
        <ComboBox ItemsSource="{Binding StringItemsList}" SelectedItem="{Binding StringItem}"/>
    </DockPanel>
</StackPanel>

SampleViewModel代码:

public class SampleViewModel
{
    public enum SomeType { Type1, Type2, VeryLongTypeName };

    public IEnumerable<SomeType> ItemsList
    {
        get { return (SomeType[])Enum.GetValues(typeof(SomeType)); }
    }

    public SomeType Item { get { return ItemsList.First(); } set { } }

    public IEnumerable<string> StringItemsList
    {
        get { return ItemsList.Select(type => type.ToString()); }
    }

    public string StringItem { get { return StringItemsList.First(); } set { } }
}

如果您构建代码示例,则在图片中的第二个ComboBox下面,字符串值会顺利进行。

我有以下问题:

  1. 为什么更改类型会影响图形?

  2. 如何在使用枚举时修复ComboBox显示?

  3. 欢迎任何帮助。

2 个答案:

答案 0 :(得分:1)

您的文本块样式适用于所有文本块。组合框的内容也会显示文本块,并且您将文本块的宽度限制为70。 使用您的样式的键或为组合框设置另一个文本块样式。

答案 1 :(得分:0)

使用ListBox列出项目时也会出现问题。我使用Live Property Explorer来查看正在进行的操作。这两种情况都会在TextBlock中呈现内容,但仅在使用枚举值时才会应用定义为资源的样式。不知道为什么会发生这种情况,但事情就是这样。

为了解决enum以及除string之外的其他类型的问题,我根据@ Mardukar的想法添加了以下样式:

<Style TargetType="ComboBoxItem">
    <Style.Resources>
        <Style TargetType="TextBlock" BasedOn="{x:Null}"/>
    </Style.Resources>
</Style>

@ Fredrik改变ComboBox.ItemTemplate的想法也有效。

对于ListBox,样式需要TargetType为ListBoxItem或ListBox。