WPF中如何调整滚动视图器(右下角)大小

11

我在树形视图和列表框中启用了滚动查看器,并参考了这个网站来自定义滚动条,并且已经达到了我需要的效果。现在我的滚动条看起来像下面这张图片:

enter image description here

但是我需要我的滚动条看起来像这样:

enter image description here

我需要右下角的空白处填充水平或垂直滚动条。这在wpf中是否可能?

以下是滚动条的自定义样式:

<local:ThicknessConverter x:Key="ThicknessConverter" />
    <Style x:Key="{x:Type ScrollBar}" TargetType="{x:Type ScrollBar}">
        <Setter Property="SnapsToDevicePixels" Value="True"/>
        <Setter Property="OverridesDefaultStyle" Value="true"/>
        <Style.Triggers>
            <Trigger Property="Orientation" Value="Horizontal">
                <Setter Property="Width" Value="Auto"/>
                <Setter Property="Height" Value="18" />
                <Setter Property="Template"

                    Value="{StaticResource HorizontalScrollBar}" />
            </Trigger>
            <Trigger Property="Orientation" Value="Vertical">
                <Setter Property="Width" Value="18"/>
                <Setter Property="Height" Value="Auto" />
                <Setter Property="Template"

                    Value="{StaticResource VerticalScrollBar}" />
            </Trigger>
            <Trigger Property="Name" Value="PART_VerticalScrollBar">
                <Setter Property="Margin" Value="{Binding RelativeSource={RelativeSource AncestorType=ScrollViewer},Converter={StaticResource ThicknessConverter}}">
                </Setter>
            </Trigger>

        </Style.Triggers>


    </Style>

这里是他们的树形视图代码

   <telerik:RadTreeView x:Name="radTreeView"   Background="#4E4E4E" Margin="0,0,456,0" Grid.Row="2"  
              ItemsSource="{x:Static local:MainWindow.AnimalCategories}" ItemPrepared="treeView_ItemPrepared" 
                             ScrollViewer.HorizontalScrollBarVisibility="Visible" ScrollViewer.VerticalScrollBarVisibility="Visible" Grid.RowSpan="2" Grid.ColumnSpan="2">
            <telerik:RadTreeView.ItemTemplate>
                <HierarchicalDataTemplate ItemsSource="{Binding Animals}">
                    <TextBlock  Text="{Binding Category}" />
                    <HierarchicalDataTemplate.ItemTemplate>
                        <DataTemplate>

                            <TextBlock Text="{Binding Name}"/>

                        </DataTemplate>
                    </HierarchicalDataTemplate.ItemTemplate>
                </HierarchicalDataTemplate>
            </telerik:RadTreeView.ItemTemplate>

        </telerik:RadTreeView>

提供一下你现在的代码怎么样? - Evk
1个回答

4
以下是一种方法:
XAML:
 <ScrollViewer Height="400" Width="400" VerticalScrollBarVisibility="Visible" HorizontalScrollBarVisibility="Visible" >
    <ScrollViewer.Resources>
        <local:ThicknessConverter x:Key="ThicknessConverter" />
        <Style TargetType="ScrollBar">
            <Style.Triggers>
                <Trigger Property="Orientation" Value="Horizontal">
                    <Setter Property="Margin" Value="{Binding RelativeSource={RelativeSource AncestorType=ScrollViewer},Converter={StaticResource ThicknessConverter}}">
                    </Setter>
                </Trigger>
            </Style.Triggers>
        </Style>
    </ScrollViewer.Resources>
</ScrollViewer>

转换器:

public class ThicknessConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        var scrollBars = FindVisualChildren<ScrollBar>(value as DependencyObject);
        foreach (var scrollBar in scrollBars)
        {
            if (scrollBar.Orientation == Orientation.Horizontal)
            {
              return  new Thickness(0, 0, 0, 0 - scrollBar.ActualHeight);
            }
        }
        return new Thickness(0, 0, 0, 0);
    }

    public static IEnumerable<T> FindVisualChildren<T>(DependencyObject depObj) where T : DependencyObject
    {
        if (depObj != null)
        {
            for (int i = 0; i < VisualTreeHelper.GetChildrenCount(depObj); i++)
            {
                DependencyObject child = VisualTreeHelper.GetChild(depObj, i);
                if (child != null && child is T)
                {
                    yield return (T)child;
                }

                foreach (T childOfChild in FindVisualChildren<T>(child))
                {
                    yield return childOfChild;
                }
            }
        }
    }        

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

输出:

滚动


@dahsra,你在使用其他样式来控制你的滚动视图吗?如果是,请提供代码或将我的样式触发器移植到那个样式中。 - Kylo Ren
实际上我并没有使用单独的滚动条。我只是使用了树形视图默认的滚动条,并为该滚动条定义了其他样式。 - Dah Sra
@dahsra 这里一切都好...在树形视图中,样式也会起作用...问题出在HorizontalScrollBar和VerticalScrollBar上...你是自己定义的吗?如果是,请提供代码。 - Kylo Ren
@dahsra 你可以通过将OverridesDefaultStyle的setter注释掉并使用模板setter来验证这个理论,一切都会正常工作。 - Kylo Ren
让我们在聊天中继续这个讨论 - Dah Sra
@dahsra 很抱歉,我不能再这样帮助你了……你需要提供你正在使用的示例,然后我才能找出实际问题。根据我的调查,telerik控件使用WPF的相同滚动条,因此上述解决方案应该完美运作,正如您知道它对于普通TreeView的运作是完美的。 - Kylo Ren

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接