c# – ListView ComputedVerticalScrollBarVisibilityProperty总是返回Visible?

我在Listview中有一个GridView:

<ListView>                    
  <ListView.View>
    <GridView>
      <GridViewColumn Width="100" />               
      <GridViewColumn Width="130" />               
      <GridViewColumn Width="130" />           
    </GridView>
  </ListView.View>
</ListView>

我想检测垂直滚动条何时对用户可见.

出于某种原因,即使滚动条不可见,这行代码也始终返回Visible:
listView.GetValue(ScrollViewer.ComputedVerticalScrollBarVisibilityProperty)

我在这做错了什么?

最佳答案 因为您要查找的值位于ListBox的内部ScrollViewer中.

你可以用这样的东西得到它的价值:

(使用How to get children of a WPF container by type?)

XAML:

<Window x:Class="WpfApplication1.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"
        Title="MainWindow"
        Width="525"
        Height="350"
        mc:Ignorable="d">
    <Grid>

        <ListBox x:Name="Box">
            <ListBoxItem>abcd</ListBoxItem>
            <ListBoxItem>abcd</ListBoxItem>
            <ListBoxItem>abcd</ListBoxItem>
            <ListBoxItem>abcd</ListBoxItem>
            <ListBoxItem>abcd</ListBoxItem>
            <ListBoxItem>abcd</ListBoxItem>
            <ListBoxItem>abcd</ListBoxItem>
            <ListBoxItem>abcd</ListBoxItem>
            <ListBoxItem>abcd</ListBoxItem>
            <ListBoxItem>abcd</ListBoxItem>
            <ListBoxItem>abcd</ListBoxItem>
            <ListBoxItem>abcd</ListBoxItem>
            <ListBoxItem>abcd</ListBoxItem>
            <ListBoxItem>abcd</ListBoxItem>
            <ListBoxItem>abcd</ListBoxItem>
            <ListBoxItem>abcd</ListBoxItem>
            <ListBoxItem>abcd</ListBoxItem>
        </ListBox>

    </Grid>
</Window>

码:

using System.Diagnostics;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;

namespace WpfApplication1
{
    public partial class MainWindow
    {
        public MainWindow()
        {
            InitializeComponent();
            SizeChanged += MainWindow_SizeChanged;
        }

        private void MainWindow_SizeChanged(object sender, SizeChangedEventArgs e)
        {
            var viewer = GetChildOfType<ScrollViewer>(Box);
            if (viewer != null)
            {
                Debug.WriteLine(viewer.ComputedVerticalScrollBarVisibility);
            }
        }

        public static T GetChildOfType<T>(DependencyObject depObj)
            where T : DependencyObject
        {
            if (depObj == null)
                return null;

            for (var i = 0; i < VisualTreeHelper.GetChildrenCount(depObj); i++)
            {
                var child = VisualTreeHelper.GetChild(depObj, i);

                var result = child as T ?? GetChildOfType<T>(child);
                if (result != null)
                    return result;
            }
            return null;
        }
    }
}

您可以使用Snoop观看和研究您的WPF应用程序事件和属性.

点赞