Условно установленный размер кнопки полосы прокрутки

1

Я хочу изменить размер всех полос прокрутки (стрелки и большой палец) в моем приложении, в зависимости от состояния. Условие - это переменная bool (Settings.TouchScreenMode) в ViewModel главного окна.
Я хотел бы сделать это с помощью триггера, что-то вроде этого:

<Style.Triggers>
    <DataTrigger Binding="{Binding DataContext.Settings.TouchScreenMode, 
             RelativeSource={RelativeSource AncestorType=Window}}" Value="True">
        <Setter Property="ArrowButtonWidth" Value="30" />
    </DataTrigger>
</Style.Triggers>

Я нашел способ установить некоторые SystemParameters но я не могу использовать его в триггере, поэтому полоса прокрутки всегда изменяется, и не только тогда, когда мое значение bool истинно:

<system:Double x:Key="{x:Static SystemParameters.HorizontalScrollBarHeightKey}">30</system:Double>
<system:Double x:Key="{x:Static SystemParameters.HorizontalScrollBarButtonWidthKey}">30</system:Double>
<system:Double x:Key="{x:Static SystemParameters.VerticalScrollBarWidthKey}">30</system:Double>
<system:Double x:Key="{x:Static SystemParameters.VerticalScrollBarButtonHeightKey}">30</system:Double>

Есть ли способ сделать это без замены всего шаблона управления полосой прокрутки?

Теги:
wpf
triggers

2 ответа

3
Лучший ответ

Вы можете использовать LayoutTransform для достижения того же

поэтому просто используйте ScaleTransform в LayoutTransform и все сделано для сенсорного экрана

например

<StackPanel Orientation="Horizontal">
    <ScrollBar Margin="4" />
    <ScrollBar Margin="4">
        <ScrollBar.LayoutTransform>
            <ScaleTransform ScaleX="2"
                            ScaleY="2" />
        </ScrollBar.LayoutTransform>
    </ScrollBar>
</StackPanel>

результат

Изображение 174551

вы можете использовать как

    <Style.Triggers>
        <DataTrigger Binding="{Binding DataContext.Settings.TouchScreenMode, 
         RelativeSource={RelativeSource AncestorType=Window}}"
                     Value="True">
            <Setter Property="LayoutTransform">
                <Setter.Value>
                    <ScaleTransform ScaleX="2"
                                    ScaleY="2" />
                </Setter.Value>
            </Setter>>
        </DataTrigger>
    </Style.Triggers>
  • 0
    Хорошая идея, спасибо.
2

Почему бы просто не привязаться к значению с помощью конвертера значений. Однако вам нужно определить свой boolToWidthConverter в Resources.

<Style>
        <Setter Property="ArrowButtonWidth" Value="{Binding Settings.TouchScreenMode, 
             RelativeSource={RelativeSource AncestorType=Window}}", Converter={StaticResource boolToWidthConverter} />

</Style>

EDIT: Возможно, вы можете установить эти значения программно.

public partial class GlobalResources : ResourceDictionary
{
    public GlobalResources()
    {
        this.Add("SystemParameters.HorizontalScrollBarButtonWidthKey", your_conditional_value);
    }
}
  • 0
    Моя основная проблема заключается в том, что нет такого свойства, как ArrowButtonWidth и я могу получить доступ только к ширине, установив системные параметры или заменив шаблон ArrowButtonWidth управления. Но все равно спасибо за предложение.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню