代码之家  ›  专栏  ›  技术社区  ›  MatrixRonny

WPF组合框截断项

  •  0
  • MatrixRonny  · 技术社区  · 6 年前

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

    这是一张发生了什么的照片。第三项应为“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 { } }
    }
    

    如果您构建代码示例,在图片下面的第二个组合框中,字符串值的处理会很顺利。

    我有以下问题:

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

    2. 如何修复使用枚举时的组合框显示?

    欢迎任何帮助。

    2 回复  |  直到 6 年前
        1
  •  1
  •   Mardukar    6 年前

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

        2
  •  0
  •   MatrixRonny    6 年前

    使用列表框列出项目时也会出现此问题。我使用Live Property Explorer查看了发生的情况。这两种情况都在文本块中呈现内容,但仅当使用枚举值时,才会应用定义为资源的样式。不知道为什么会这样,但事实就是这样。

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

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

    @弗雷德里克改变组合框的想法。ItemTemplate也可以工作。

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