在DropDownButton中使用ScrollBar?

时间:2016-10-06 17:54:55

标签: c# wpf xaml mahapps.metro

我想在我的ComboBox按钮中使用DropDown之类的滚动条,结构实际上就是这样:

<Controls:DropDownButton Content="Nazioni" Width="120" Margin="0, 0, 20, 0" 
                         ScrollViewer.VerticalScrollBarVisibility="Visible"
                         ScrollViewer.CanContentScroll="True"
                         ItemsSource="{Binding Countries}"
                         ItemTemplate="{StaticResource CombinedTemplate}"/>

但是我没有看到任何ScrollViewer,如下图所示:

enter image description here

2 个答案:

答案 0 :(得分:1)

为确保滚动操作符合预期,您不能依赖WPF将ScrollViewer置于应有的位置。

由于任何内容都可以放在下拉列表中,因此最好选择将ScrollViewer直接放在组件上。 这样,您可以显式命名,并可以访问其属性。 如果您将国家/地区列表绑定到lstContent框,则可以解决所有问题。

   <extToolkit:DropDownButton Content="Click Me" Margin="15" >
        <extToolkit:DropDownButton.DropDownContent>
            <ScrollViewer>
                <ListBox Name="lstContent" ItemsSource="{Binding Countries}" ItemTemplate="{StaticResource CombinedTemplate}"/> 
            </ScrollViewer>
        </extToolkit:DropDownButton.DropDownContent>
    </extToolkit:DropDownButton>

答案 1 :(得分:1)

DropDownButton的下拉列表已包含ScrollViewer(名为"SubMenuScrollViewer"),因此可以开箱即用滚动浏览其项目。问题是,特定的ScrollViewer的样式与默认的ScrollViewer不同 - 假设我们正在讨论垂直滚动,它在列表的上方和下方有两个按钮,分别负责上下滚动,如下图所示:

enter image description here

因此,最好的办法是让特定ScrollViewer使用默认样式而不是自定义样式。通过检查MahApps.Metro source code,我们可以看到有问题的ScrollViewer被连接到使用密钥值为{ComponentResourceKey ResourceId=MenuScrollViewer, TypeInTargetAssembly={x:Type FrameworkElement}}的动态资源。所以你需要做的是为该控件提供一个默认样式:

<Controls:DropDownButton (...)>
    <Controls:DropDownButton.Resources>
        <Style x:Key="{ComponentResourceKey ResourceId=MenuScrollViewer, TypeInTargetAssembly={x:Type FrameworkElement}}"
               TargetType="{x:Type ScrollViewer}"
               BasedOn="{StaticResource {x:Type ScrollViewer}}" />
    </Controls.DropDownButton.Resources>
</Controls.DropDownButton>

这样,下拉列表中的ScrollViewer将使用 MahApps.Metro 附带的默认样式设置样式。