组合框在WinRT中的奇怪行为

时间:2014-11-17 08:24:39

标签: xaml combobox windows-runtime windows-8.1

WinRT中的组合框具有CarouselPanel类型的默认ItemsPanel。这为Windows 8.1应用程序提供了一个无限循环"滚动组合框项目时。 如果你不想要这种行为,那么有很多博客文章解释了如何解决这个问题"。

例如:Cancel WinRT ComboBox infinte scroll effect 或:http://netitude.bc3tech.net/2013/04/12/windows-8s-combobox-and-the-carouselpanel/

此解决方案的问题在于您在组合框中的第一个项目上获得了奇怪的行为。 如何重现:

  • 创建一个新的空白Windows 8.1应用
  • 在mainpage.xaml中:

    <TimePicker Time="0" HorizontalAlignment="Center" VerticalAlignment="Center"/>
    
  • 像这样创建一个style.xaml资源字典:

    <Style TargetType="ComboBox">
        <Style.Setters>
            <Setter Property="ItemsPanel">
                <Setter.Value>
                    <ItemsPanelTemplate>
                        <StackPanel Orientation="Vertical"/>
                    </ItemsPanelTemplate>
                </Setter.Value>
            </Setter>
        </Style.Setters>
    </Style>
    
  • 现在启动应用,在列表中选择一个项目(例如&#39; 05&#39;分钟),然后选择同一下拉列表中的第一个项目(例如&#39; 00&#39 ; 分钟)。下拉控件中的文本现在将消失。

任何人都知道如何解决这个问题?如果我将combobox itemspanel的样式更改回CarouselPanel它可以工作(但当然是无限循环)。

2 个答案:

答案 0 :(得分:4)

刚刚使用VirtualizingStackPanel代替StackPanel更正了此问题。 我们必须设置一个尺寸因为它占据屏幕的所有宽度。

<VirtualizingStackPanel HorizontalAlignment="Center" Width="150"/>

我们没有尝试获得更灵活的解决方案,因为我们还不需要它

希望它能帮到你

答案 1 :(得分:1)

StackPanel刚刚不使用ComoboBox可能的解决方案是将其更改为VirtualizingStackPanel,但是你必须绑定到父级,否则它将扩展到屏幕宽度。

<ComboBox Name="ReasonComboBox"">
<ComboBox.ItemsPanel>
    <ItemsPanelTemplate>
        <VirtualizingStackPanel Width="{Binding ActualWidth, ElementName=ReasonComboBox}"/>
    </ItemsPanelTemplate>
</ComboBox.ItemsPanel>
</ComboBox>