none
如何判断滚动条已显示 RRS feed

  • 问题

  • 控件的滚动条设置成:Auto 那么如何获得滚动条已显现或未显示?

    例如DataGrid控件 VerticalScrollbility属性的说明是:获取或设置...垂直滚动条的可见性

    这个属性好像只能设置,却无法获得其显示的状态.为什么?有什么方法获取其显示状态呢?

    2011年12月26日 1:50

答案

  • 你可以使用VisualTreeHelper这个类来遍历可视化数结构,找到相应的滚动条,通过它的Visibility 属性判断滚动条当前的显示状态。

    在Debug 模式下看VisualTree:

    你可以在任意控件或者是Window Loaded 事件的最后加设断点,进入调试后,把鼠标移到参数sender 的上方点击放大镜图标。

    下面这个例子演示了如何通过类型和名称查找可视化树中子元素,希望可以帮到你。

     public static T FindVisualChildByName<T>(DependencyObject parent, string name) where T : DependencyObject
            {
                for (int i = 0; i < VisualTreeHelper.GetChildrenCount(parent); i++)
                {
                    var child = VisualTreeHelper.GetChild(parent, i);
                    string controlName = child.GetValue(Control.NameProperty) as string;
                    if (controlName == name)
                    {
                        return child as T;
                    }
                    else
                    {
                        T result = FindVisualChildByName<T>(child, name);
                        if (result != null)
                            return result;
                    }
                }
                return null;
            }
    
            private void button1_Click(object sender, RoutedEventArgs e)
            {
                ScrollBar hscroll = FindVisualChildByName<ScrollBar>(this, "PART_HorizontalScrollBar");
                ScrollBar vscroll = FindVisualChildByName<ScrollBar>(this, "PART_VerticalScrollBar");
                Console.WriteLine("hscroll: {0}", hscroll.Visibility);
                Console.WriteLine("vscroll: {0}", vscroll.Visibility);
            }
    

    Have a nice day,


    Kee Poppy [MSFT]
    MSDN Community Support | Feedback to us
    • 已建议为答案 Jie BaoModerator 2011年12月26日 8:18
    • 已标记为答案 仁虎 2011年12月27日 11:13
    2011年12月26日 8:04
    版主
  • 你用VS2010 debug下面看一下可视树,就清楚了:

    如果始终是 Visible,说明他始终是显示的,只是它的大小和位置可能你正好看不见,你这个时候应该要检查他的其他属性。还有一种可能是他的父控件肯能是隐藏的,你也可以看一下。

    Sincerely,


    Bob Bao [MSFT]
    MSDN Community Support | Feedback to us
    • 已标记为答案 仁虎 2011年12月27日 11:13
    2011年12月27日 2:50
    版主
  • 看来都是FindName惹的祸
    • 已标记为答案 仁虎 2011年12月27日 11:14
    2011年12月27日 11:14

全部回复

  • 你可以使用VisualTreeHelper这个类来遍历可视化数结构,找到相应的滚动条,通过它的Visibility 属性判断滚动条当前的显示状态。

    在Debug 模式下看VisualTree:

    你可以在任意控件或者是Window Loaded 事件的最后加设断点,进入调试后,把鼠标移到参数sender 的上方点击放大镜图标。

    下面这个例子演示了如何通过类型和名称查找可视化树中子元素,希望可以帮到你。

     public static T FindVisualChildByName<T>(DependencyObject parent, string name) where T : DependencyObject
            {
                for (int i = 0; i < VisualTreeHelper.GetChildrenCount(parent); i++)
                {
                    var child = VisualTreeHelper.GetChild(parent, i);
                    string controlName = child.GetValue(Control.NameProperty) as string;
                    if (controlName == name)
                    {
                        return child as T;
                    }
                    else
                    {
                        T result = FindVisualChildByName<T>(child, name);
                        if (result != null)
                            return result;
                    }
                }
                return null;
            }
    
            private void button1_Click(object sender, RoutedEventArgs e)
            {
                ScrollBar hscroll = FindVisualChildByName<ScrollBar>(this, "PART_HorizontalScrollBar");
                ScrollBar vscroll = FindVisualChildByName<ScrollBar>(this, "PART_VerticalScrollBar");
                Console.WriteLine("hscroll: {0}", hscroll.Visibility);
                Console.WriteLine("vscroll: {0}", vscroll.Visibility);
            }
    

    Have a nice day,


    Kee Poppy [MSFT]
    MSDN Community Support | Feedback to us
    • 已建议为答案 Jie BaoModerator 2011年12月26日 8:18
    • 已标记为答案 仁虎 2011年12月27日 11:13
    2011年12月26日 8:04
    版主
  • 非常感谢您的回复, 我用层层扒皮的方法查找到的滚动条控件,其路径是:在DataGrid的Template中找DG_ScrollViewer,再在其Template中找到PART_V..滚动条控件, 也是通过Visibility想获取其显示状态,但滚动条无论显示与否其值始终是Visible,我想是不是这么找的控件只是在模板中的控件而非实际使用中的?
    2011年12月26日 11:46
  • 你用VS2010 debug下面看一下可视树,就清楚了:

    如果始终是 Visible,说明他始终是显示的,只是它的大小和位置可能你正好看不见,你这个时候应该要检查他的其他属性。还有一种可能是他的父控件肯能是隐藏的,你也可以看一下。

    Sincerely,


    Bob Bao [MSFT]
    MSDN Community Support | Feedback to us
    • 已标记为答案 仁虎 2011年12月27日 11:13
    2011年12月27日 2:50
    版主
  • 看来都是FindName惹的祸
    • 已标记为答案 仁虎 2011年12月27日 11:14
    2011年12月27日 11:14