【问题标题】:WPF ComboBox truncating itemsWPF ComboBox 截断项目
【发布时间】:2018-03-29 13:26:29
【问题描述】:

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

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

这是按照 MVVM 模式编写的代码示例。

用户控件 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 显示?

欢迎任何帮助。

【问题讨论】:

  • ComboBox 中的项目是否也可能被视为TextBlock 类型?因为这看起来像相同的宽度。不太了解 WPF,但也许您不应该以这种全局方式应用您的样式。
  • 如果设置 ComboBox.ItemTemplate 会发生什么?
  • @Nyerguds 是的,我也注意到了。我在帖子中提到,由于 TextBox 样式,组合框中的项目被截断。如果您删除该样式,项目将正常显示。
  • @Fredrik 好的,那行得通。我使用了带有 Text="{Binding}" 的 TextBox 的 DataTemplate。谢谢。第一个问题呢?
  • StringItem = StringItemsList[0]; 在您的构造函数中是正确的方法。

标签: c# wpf xaml mvvm combobox


【解决方案1】:

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

【讨论】:

  • 我想过。我想避免为每个 TextBox 指定样式。考虑到在我的主应用程序中,我定义了 DockPanel 的样式并在其中包含了 TextBlock 样式。无论如何,为什么第二个 ComboBox 不会发生这种情况?
  • ComboboxItem 的样式怎么样?
  • 你给了我一个好主意。我为 ComboBox 创建了一个样式,并在其中添加了一个 TextBlock 样式 BasedOn="{x:Null}"。这解决了第二个问题中提出的问题。谢谢!
【解决方案2】:

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

为了解决枚举和除字符串之外的其他类型的问题,我根据@Mardukar 的想法添加了以下样式:

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

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

对于 ListBox,样式的 TargetType 必须是 ListBoxItem 或 ListBox。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-06
    • 2013-07-14
    • 2016-01-17
    相关资源
    最近更新 更多