创建可滚动的WPF用户控件

时间:2012-03-10 11:15:04

标签: wpf custom-controls scrollviewer

对于我正在处理的应用程序,我想创建一个自定义控件,上面有几个按钮,如果有太多按钮,我需要它来滚动。但是,我不想使用标准滚动条而只是想在控件的两端有两个按钮向上滚动而另一个向下滚动。实现这一目标的最佳方法是什么?

是否可以更改滚动条的样式,使它们只是按钮而不是完整的水平GUI?

3 个答案:

答案 0 :(得分:20)

您通常会使用 ScrollViewer 来实现此目的。例如:

<UserControl x:Class="WpfApplication2.UserControl1"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             mc:Ignorable="d" 
             d:DesignHeight="200" d:DesignWidth="300">
    <ScrollViewer>
        <StackPanel>
            <Button Content="Test"/>
            <Button Content="Test"/>
            <Button Content="Test"/>
            <Button Content="Test"/>
            <Button Content="Test"/>
            <Button Content="Test"/>
            <Button Content="Test"/>
            <Button Content="Test"/>
            <Button Content="Test"/>
            <Button Content="Test"/>
            <Button Content="Test"/>
            <Button Content="Test"/>
        </StackPanel>
    </ScrollViewer>
</UserControl>

在需要时会自动显示垂直滚动条。

您可以通过指定 VerticalScrollbarVisibility 来更改行为

<ScrollViewer VerticalScrollBarVisibility="Auto">
<ScrollViewer VerticalScrollBarVisibility="Visible">
<ScrollViewer VerticalScrollBarVisibility="Hidden">
<ScrollViewer VerticalScrollBarVisibility="Disabled">

当然还有 Horizo​​ntalScrollBarVisibility 属性。

答案 1 :(得分:1)

解决这类问题的方法是检查控件的属性和方法。

<Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="auto" />
        <RowDefinition Height="*" />
        <RowDefinition Height="auto" />
    </Grid.RowDefinitions>
    <Button Grid.Row="0" Width="40" HorizontalAlignment="Left" Content="Up" Click="clickSVup"/>
    <ScrollViewer x:Name="svBtn" Grid.Row="1" Width="100" HorizontalAlignment="Left" 
                  VerticalScrollBarVisibility="Hidden" HorizontalScrollBarVisibility="Hidden">
        <StackPanel>
            <TextBlock Text="Text 01"/>
            <TextBlock Text="Text 02"/>
            <TextBlock Text="Text 03"/>
            <TextBlock Text="Text 04"/>
            <TextBlock Text="Text 05"/>
            <TextBlock Text="Text 06"/>
            <TextBlock Text="Text 07"/>
            <TextBlock Text="Text 08"/>
            <TextBlock Text="Text 09"/>
            <TextBlock Text="Text 10"/>
            <TextBlock Text="Text 11"/>
            <TextBlock Text="Text 12"/>
            <TextBlock Text="Text 13"/>
            <TextBlock Text="Text 14"/>
            <TextBlock Text="Text 15"/>
            <TextBlock Text="Text 16"/>
            <TextBlock Text="Text 17"/>
            <TextBlock Text="Text 18"/>
            <TextBlock Text="Text 19"/>
        </StackPanel>
    </ScrollViewer>
    <Button Grid.Row="2" Width="40" HorizontalAlignment="Left" Content="Down" Click="clickSVdn"/>
</Grid>



    private void clickSVdn(object sender, RoutedEventArgs e)
    {
        svBtn.PageDown();
    }

    private void clickSVup(object sender, RoutedEventArgs e)
    {
        svBtn.PageUp();
    }

答案 2 :(得分:0)

我建议您使用标准的Windows滚动条,而不是使用一些自定义按钮向上滚动和向下滚动。用户非常习惯于滚动目的。如果使用两个按钮,则必须进一步显示滚动进度等其他内容。不要重新发明轮子:)