将ComboBox与枚举项一起使用时,我发现了一种奇怪的行为。我注意到,单击ComboBox时显示条目的弹出窗口会截断长项目。我发现这是因为我定义了一个具有固定宽度的TextBlock样式。奇怪的是,当我使用枚举项时,宽度仅影响ComboBox。它不会发生如果我改为使用字符串。
这是一张正在发生的事情的图片。第三项应为“VeryLongTypeName”。
以下是根据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下面,字符串值会顺利进行。
我有以下问题:
为什么更改类型会影响图形?
如何在使用枚举时修复ComboBox显示?
欢迎任何帮助。
答案 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。