C# 检测ScrollViewer的滚动条是否可见
我有一个树景。现在,我想检测垂直滚动条是否可见。 当我试着用它的时候C# 检测ScrollViewer的滚动条是否可见,c#,wpf,scrollviewer,C#,Wpf,Scrollviewer,我有一个树景。现在,我想检测垂直滚动条是否可见。 当我试着用它的时候 var visibility = this.ProjectTree.GetValue(ScrollViewer.VerticalScrollBarVisibilityProperty) (其中this.ProjectTree是树视图) 我总是能自动看到 如何检测滚动条是否可见 谢谢。计算垂直滚动条可见性,而不是垂直滚动条可见性 VerticalScrollBarVisibility设置或获取行为,而ComputedVerti
var visibility = this.ProjectTree.GetValue(ScrollViewer.VerticalScrollBarVisibilityProperty)
(其中this.ProjectTree是树视图)
我总是能自动看到
如何检测滚动条是否可见
谢谢。计算垂直滚动条可见性,而不是垂直滚动条可见性 VerticalScrollBarVisibility设置或获取行为,而ComputedVerticalScrollBarVisibility提供实际状态
您不能像在代码示例中那样访问此属性,请参见Thomas Levesque的答案:)您可以使用
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;
}
}
}
公共静态IEnumerable GetDescents(此DependencyObject对象)
{
foreach(obj.GetChildren()中的变量child)
{
退换子女;
foreach(child.getDescents()中的var后代)
{
产量回报后代;
}
}
}
像这样使用它:
var scrollViewer = ProjectTree.GetDescendants().OfType<ScrollViewer>().First();
var visibility = scrollViewer.ComputedVerticalScrollBarVisibility;
var scrollViewer=ProjectTree.getsubjects().OfType().First();
var visibility=scrollViewer.ComputedVerticalScrollBarVisibility;
我发现的最简单的方法是订阅ScrollChanged
事件,它是附加属性ScrollViewer
的一部分,例如:
<TreeView ScrollViewer.ScrollChanged="TreeView_OnScrollChanged">
</TreeView>
出于某种原因,IntelliSense没有向我显示该事件,但它可以正常工作。是的,但它是ScrollViewer的属性,而不是TreeView,因此您需要首先在模板中找到ScrollViewer。我假设如果OP中的代码返回结果,那么它成功地解决了ScrollViewer allready问题,只是错误的属性…不,因为ScrollViewer.VerticalScrollBarVisibility是一个附加属性,它是在TreeView而不是ScrollViewer上设置的。出于好奇,为什么需要这样做?在大多数情况下,我看到有人这样做,这是解决其他问题的次优方式。@MikeStrobel问题是无限的。数一数没有意义你能给这个属性附加一个属性更改事件吗?@malthe,我不认为这有什么特别的事件,但是因为它是一个依赖属性,您始终可以使用
DependencyPropertyDescriptor.AddValueChanged
查看它。请注意,如果您试图在Scrollviewer上使用ComputedVerticalScrollBarVisibility,请确保在xaml中使用VerticalScrollBarVisibility=“Auto”
private void TreeView_OnScrollChanged(object sender, ScrollChangedEventArgs e)
{
if (e.OriginalSource is ScrollViewer sv)
{
Debug.WriteLine(sv.ComputedVerticalScrollBarVisibility);
}
}