簡體   English   中英

檢測,如果ScrollViewer的ScrollBar可見或不可見

[英]Detect, if ScrollBar of ScrollViewer is visible or not

我有一個TreeView。 現在,我想檢測,如果垂直滾動條是否可見。 我試試的時候

var visibility = this.ProjectTree.GetValue(ScrollViewer.VerticalScrollBarVisibilityProperty)

(其中this.ProjectTree是TreeView)我總是獲得Auto以獲得可見性。

如果ScrollBar有效可見,我該如何檢測?

謝謝。

您可以使用ComputedVerticalScrollBarVisibility屬性。 但為此,您首先需要在TreeView的模板中找到ScrollViewer 為此,您可以使用以下擴展方法:

    public static IEnumerable<DependencyObject> GetDescendants(this DependencyObject obj)
    {
        foreach (var child in obj.GetChildren())
        {
            yield return child;
            foreach (var descendant in child.GetDescendants())
            {
                yield return descendant;
            }
        }
    }

像這樣使用它:

var scrollViewer = ProjectTree.GetDescendants().OfType<ScrollViewer>().First();
var visibility = scrollViewer.ComputedVerticalScrollBarVisibility;

ComputedVerticalScrollBarVisibility而不是VerticalScrollBarVisibility

VerticalScrollBarVisibility設置或獲取行為 ,而ComputedVerticalScrollBarVisibility為您提供實際狀態。

http://msdn.microsoft.com/en-us/library/system.windows.controls.scrollviewer.computedverticalscrollbarvisibility(v=vs.110).aspx

您無法像在代碼示例中那樣訪問此屬性,請參閱Thomas Levesque對此的回答:)

我發現最簡單的方法是簡單地訂閱ScrollChanged事件,該事件是附加屬性ScrollViewer ,例如:

<TreeView ScrollViewer.ScrollChanged="TreeView_OnScrollChanged">
</TreeView>

代碼隱藏:

private void TreeView_OnScrollChanged(object sender, ScrollChangedEventArgs e)
{
    if (e.OriginalSource is ScrollViewer sv)
    {
        Debug.WriteLine(sv.ComputedVerticalScrollBarVisibility);
    }
}

出於某種原因,IntelliSense沒有向我展示該事件,但它有效。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM