2017-02-17 2 views
4

У меня есть GridView в Listview:ListView ComputedVerticalScrollBarVisibilityProperty всегда возвращает Visible?

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

Я хочу, чтобы определить, когда вертикальная полоса прокрутки видна пользователю.

По некоторым причинам, эта строка кода всегда возвращает Visible, даже когда полоса прокрутки не видна: listView.GetValue(ScrollViewer.ComputedVerticalScrollBarVisibilityProperty)

Что я здесь делаю неправильно?

ответ

2

Потому что значение, которое вы ищете, находится во внутреннем ScrollViewer в ListBox.

Вы можете получить значение этого что-то вроде этого:

(с использованием 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; 
     } 
    } 
} 

Вы можете смотреть и изучите ваши события и свойства приложения WPF, используя Snoop.

+0

Я использую ListView, а не ListBox - мне все еще нужен метод GetChildOfType? –

+1

Боюсь, что да, потому что вы получаете внутренний ScrollViewer, поскольку он не публично открыт. – Aybe

Смежные вопросы