2016-12-22 8 views
0

То же, что и this question, но для UWP. В частности, я не могу найти класс SystemParameters, поэтому ответ там не работает в моем случае.Найти ширину полосы прокрутки

Также важно: если возможно, я хотел бы иметь возможность получить ширину полосы прокрутки, если она существует. Другими словами, есть случаи, когда полоса прокрутки еще не существует, но пользовательский ввод, вероятно, заставит ее создать. В таком случае я хочу знать, какую ширину он должен иметь, если/когда он создан. (Я понимаю, что что-то неожиданное может привести к тому, что ответ будет неправильным, это нормально, если я получаю обычный ожидаемый ответ.)

+0

Хм. В 'System.Windows.Forms' это' SystemInformation.VerticalScrollBarWidth'. Не уверен, что в UWP все равно. – Nyerguds

ответ

1

Как ответ @ Neme, вы можете использовать VisualTreeHelper для извлечения ScrollBar, а затем использовать свойство ActualWidth, чтобы получить его ширину.

Однако, если вы не изменили VerticalScrollBar «s стили и шаблоны, ширина VerticalScrollBar всегда будет . Вы можете найти это в ScrollBar styles and templates.

<Style TargetType="ScrollBar"> 
    <Setter Property="MinWidth" Value="12" /> 
    <Setter Property="MinHeight" Value="12" /> 
    ... 
</Style 

Для VerticalScrollBar, его ширина не изменится, так его ActualWidth всегда будет 12. И HorizontalScrollBar, его высота не изменится, так его ActualHeight всегда будет 12. Эти изменения значения только тогда, когда мы изменяем прокрутки-х стиль или шаблон. И в этом случае мы должны знать ширину, которую мы установили, или мы можем получить ее во время выполнения, используя VisualTreeHelper.

+0

Я тоже нашел это, жестко закодированное в шаблонах. Мне кажется, что для этого должен быть ресурс, чтобы легко получить значение по умолчанию (в случае его изменения). – Neme

0

Насколько я знаю, нет лучшего способа, кроме поиска в свойствах сам. В UWP действительно много хакеров. Например, похоже, что вы не можете получить ScrollBar из ScrollViewer напрямую (вы также не можете делать FindName на шаблоне или даже извлекать из него, чтобы использовать GetTemplateChild), но эти строки должны работать вокруг этого:

var rootElement = (FrameworkElement)VisualTreeHelper.GetChild(scrollViewer, 0); 
var scrollBar = (ScrollBar)rootElement.FindName("VerticalScrollBar"); 

Вы можете получить доступ к свойству ScrollBar ActualWidth, но он будет равен нулю, если он не будет виден. К счастью, я узнал, что MinWidth содержит правильное значение.

У вас должен быть видимый ScrollViewer.