我有一个 ScrollViewer,其中显示垂直滚动条,现在在更改系统分辨率时我想获取滚动条的宽度。我浏览了One StackOverflow Post,他们提到要检查 SystemParameters.ScrollWidth 属性,但我再次找不到他们的任何帮助。任何人都可以帮我解决我的问题吗?任何答案将不胜感激。
我不确定这是否是正确答案。每个 WPF 控件都可以重新设计样式,甚至滚动条也是如此。因此,SystemParameters.VerticalScrollBarWidth仅在用作默认滚动条时才有效。正确的解决方案是在可视化树中找到垂直滚动条并测量它的实际宽度。这是最精确的测量。
根据一些人的建议,
SystemParameters.VerticalScrollBarWidth
返回用于系统控制的常量。
然而,这个值并不可靠。例如,可以自定义 ScrollBar
元素。
要获取当前宽度,您必须在
ScrollViewer
的视觉树中找到滚动条。ScrollViewer
将 ScrollBar
元素定义为名为 "PART_VerticalScrollBar"
和 "PART_HorizontalScrollBar"
的模板部件。
您可以使用以下扩展方法(扩展
DependencyObject
)来获得垂直ScrollBar
:
使用方法ScrollBar
的垂直 ScrollViewer
的 DataGrid
宽度,请使用
if (dataGrid.TryFindVisualChildElementByName("PART_VerticalScrollBar", out ScrollBar scrollbar))
{
double verticalScrolBarWidth = scrollbar. Width;
}
public static class VisualTreeHelperExtensions
{
public static bool TryFindVisualChildElementByName<TChild>(
this DependencyObject parent,
string childElementName,
out TChild resultElement) where TChild : FrameworkElement
{
resultElement = null;
if (parent is Popup popup)
{
parent = popup.Child;
if (parent == null)
{
return false;
}
}
for (int i = 0; i < VisualTreeHelper.GetChildrenCount(parent); i++)
{
DependencyObject child = VisualTreeHelper.GetChild(parent, i);
if (child is FrameworkElement frameworkElement
&& frameworkElement.Name.Equals(childElementName, StringComparison.OrdinalIgnoreCase))
{
resultElement = frameworkElement as TChild;
return true;
}
if (child.TryFindVisualChildElementByName<TChild>(childElementName, out resultElement))
{
return true;
}
}
return false;
}
}