Martin February 2016

Set the width of scrollbars programmatically

I have an application, which uses WPF on windows as toolkit framework. Now I would like to set the width of scrollbars for my ScrollViewers programmatically. I found many examples to set the width via XAML. But how can I define the width of scrollbars programmatically?

Unfortunately I could not find any property or method on ScrollViewer to set the width of scrollbars.

var viewer = new ScrollViewer();
viewer.MagicProperty = 42; // Does not exist

Also all properties on SystemParameters are unfortunately read-only.

VerticalScrollBarWidth.VerticalScrollBarWidth = 42; // Read-only

Edit: WPF is only one of multiple toolkit frameworks in my application. I use a custom GUI abstraction layer for supporting Windows (WPF), Linux (GTK#) and MacOS X (in future). My user interface is encapsulated in an OS independent way. Therefore it makes no sense to use XAML.

Answers


Filip February 2016

Easiest way is to set x:Name property, then you can access ScrollViewer in your code.

Or use Binding: http://www.tutorialspoint.com/wpf/wpf_data_binding.htm

Binding will be useful if you want to manipulate with multile ScrollViewers and set same values.

EDIT: You can create ScrollViewer in your code and then set its parameters. But you need a way to insert it into VisualTree among other controls. So you need to get instance of some container and then use its Children.Add() method

However I'd really recommend to use as much XAML as you can and leave your code for application logic, not the UI building.

EDIT 2: Can you try:

            Style myStyle = new Style(typeof(ScrollBar));
            myStyle.Setters.Add(new Setter(WidthProperty, 40));

            scrollViewer.Style = myStyle;

EDIT 3: I found a solution. You can add ResourceDictionary.xaml and add this style to it:

 <Style x:Key="{x:Type ScrollBar}" TargetType="{x:Type ScrollBar}">
        <Setter Property="MinWidth" Value="35" />
        <Setter Property="Width" Value="35" />
    </Style>

Then load it at runtime like so:

Resources.MergedDictionaries.Add(Application.LoadComponent(new Uri(@"Dictionary.xaml", UriKind.Relative)) as
                ResourceDictionary);

Post Status

Asked in February 2016
Viewed 2,502 times
Voted 10
Answered 1 times

Search




Leave an answer