我想根据条件更改应用程序中所有滚动条(箭头按钮和拇指)的大小。条件是主窗口的ViewModel中的bool变量(Settings.TouchScreenMode) 我想用触发器做这件事:
<Style.Triggers>
<DataTrigger Binding="{Binding DataContext.Settings.TouchScreenMode,
RelativeSource={RelativeSource AncestorType=Window}}" Value="True">
<Setter Property="ArrowButtonWidth" Value="30" />
</DataTrigger>
</Style.Triggers>
我找到了一种设置SystemParameters
的方法,但我不能在触发器中使用它,因此滚动条总是会更改,而不仅仅是当我的bool值为true时:
<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>
有没有办法在不更换滚动条的整个控件模板的情况下执行此操作?
答案 0 :(得分:3)
您可以利用LayoutTransform
来实现相同的
所以只需在ScaleTransform
中使用LayoutTransform
,一切都在触摸屏上完成
例如
<StackPanel Orientation="Horizontal">
<ScrollBar Margin="4" />
<ScrollBar Margin="4">
<ScrollBar.LayoutTransform>
<ScaleTransform ScaleX="2"
ScaleY="2" />
</ScrollBar.LayoutTransform>
</ScrollBar>
</StackPanel>
结果
您可以使用
<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>
答案 1 :(得分:2)
为什么不使用值转换器绑定到值。但是,您需要在boolToWidthConverter
中定义Resources
。
<Style>
<Setter Property="ArrowButtonWidth" Value="{Binding Settings.TouchScreenMode,
RelativeSource={RelativeSource AncestorType=Window}}", Converter={StaticResource boolToWidthConverter} />
</Style>
修改强>: 也许您可以通过编程方式设置这些值。
public partial class GlobalResources : ResourceDictionary
{
public GlobalResources()
{
this.Add("SystemParameters.HorizontalScrollBarButtonWidthKey", your_conditional_value);
}
}