【问题标题】:Always show thumb in ScrollViewer scrollbar始终在 ScrollViewer 滚动条中显示拇指
【发布时间】:2018-08-02 23:54:53
【问题描述】:

如何让ScrollViewer 控件的滚动条始终显示滚动条缩略图,如果ScrollViewer 的内容小于可用区域,则缩略图的长度最大?

采用以下 XAML:

<Window x:Class="WpfApplication8.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WpfApplication8"
        mc:Ignorable="d"
        Title="MainWindow" Height="200" Width="200">
    <ScrollViewer HorizontalScrollBarVisibility="Visible" 
                  VerticalScrollBarVisibility="Visible">
        <Grid Height="300" Width="300" Background="Red">

        </Grid>
    </ScrollViewer>
</Window>

将窗口大小调整为小于 300x300 像素网格将使水平和垂直滚动条中的缩略图出现。

但是当窗口大小增加到大于 300x300 像素网格时,水平和垂直滚动条拇指都消失了。

【问题讨论】:

    标签: c# wpf scrollviewer


    【解决方案1】:

    始终显示滚动条缩略图

    一种可能性是订阅Track(即您点击的部分被隐藏)IsVisibilityChanged 事件并强制显示它:

    HackTheTrack(scrollViewer.FindChildren<Track>().First());
    HackTheTrack(scrollViewer.FindChildren<Track>().Skip(1).Single()); // second track
    
    void HackTheTrack(Track track)
    {
        track.Visibility = Visibility.Visible;
        track.IsVisibleChanged += (s, ee) =>
        {
            if (track.Visibility != Visibility.Visible)
                track.Visibility = Visibility.Visible;
        };
    }
    

    你将需要这个扩展方法:

    public static IEnumerable<T> FindChildren<T>(this DependencyObject @this) where T : DependencyObject
    {
        if (@this == null)
            yield break;
        for (int i = 0; i < VisualTreeHelper.GetChildrenCount(@this); i++)
        {
            var child = VisualTreeHelper.GetChild(@this, i);
            var result = child as T;
            if (result != null)
                yield return result;
            foreach (var value in FindChildren<T>(child))
                yield return value;
        }
        yield break;
    }
    

    但是这看起来很混乱:



    【讨论】:

    • 有趣的方法。虽然拇指可见,但不会调整它们的大小以填充整个轨道。但也许我需要重写计算拇指大小的方法,既要避免拇指被设置为假,又要重新计算拇指的大小以填充整个轨道。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-16
    • 1970-01-01
    • 1970-01-01
    • 2011-08-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多