WPF,改变滚动条宽度,看不懂语法
从博客园抄了一个改变滚动条宽度的方法:
<ScrollViewer HorizontalScrollBarVisibility="Auto"
xmlns:sys="clr-namespace:System;assembly=mscorlib">
<ScrollViewer.Resources>
<sys:Double x:Key="{x:Static SystemParameters.VerticalScrollBarWidthKey}">100</sys:Double>
<sys:Double x:Key="{x:Static SystemParameters.HorizontalScrollBarHeightKey}">100</sys:Double>
</ScrollViewer.Resources>
<Button Width="400" Height="400">aaa</Button>
</ScrollViewer>
实在看不懂,这是什么语法:
1:ScrollViewer只是定义了2个Double资源,又没有引用资源之类的,为什么能改变滚动条宽度?
2:
<sys:Double x:Key="{x:Static SystemParameters.VerticalScrollBarWidthKey}">100</sys:Double>
这是什么啊,一个资源?Key为什么设置为那样的?100滚动条宽度?不懂
[解决办法]
没看到吗,这是设置该资源的纵向和横向的滚动条的
[解决办法]
xaml里一个double数值也可以被定义为resource的,每个resource都有一个key和一个value。SrollViewer默认会去找是否有key为SystemParameters.VerticalScrollBarWidthKey和SystemParameters.HorizontalScrollBarHeightKey的double类型的resource,如果找到了的话,就会用它们的value来设置纵向滚动条的宽度和横向滚动条的高度,也就是你所说的“滚动条的宽度”。如果找不到,就用默认的值。我猜100应该是以像素为单位的吧。
[解决办法]
这已经指定了
x:Static SystemParameters.VerticalScrollBarWidthKey 宽
x:Static SystemParameters.HorizontalScrollBarHeightKey 高
[解决办法]
有个前提,ScrollViewer内部会用到两个ResourceKey,分别是:“SystemParameters.VerticalScrollBarWidthKey”和“SystemParameters.HorizontalScrollBarHeightKey”,这两个Key的值是系统定义的,且为静态,这里通过<sys:Double x:Key="{x:Static SystemParameters.VerticalScrollBarWidthKey}">100</sys:Double>的语法,定义了相同名称的ResourceKey,那么WPF在向上查找ResourceKey的时候,就会优先查到你定义的这个ResourceKey,使用你定义的100的值而不是系统定义的。
这只是简单的将自定义ResourceKey替换系统定义的ResourceKey的一个写法,没有太大的含义。
[解决办法]
利用这种方式,更改系统中定义的两个参数的值。而不是自定义Key
[解决办法]
老实说,这个第一种方法真的好比使用反射,我不清楚他们是怎么看系统自带控件的xaml代码的,我只能举个例子来说明下可能的情况:
<ScrollViewer HorizontalScrollBarVisibility="Auto" xmlns:s="clr-namespace:System;assembly=mscorlib">
<ScrollViewer.Resources>
<s:Double x:Key="{x:Static SystemParameters.VerticalScrollBarWidthKey}">10</s:Double>
<s:Double x:Key="{x:Static SystemParameters.HorizontalScrollBarHeightKey}">10</s:Double>
<s:Double x:Key="{x:Static SystemParameters.VerticalScrollBarThumbHeightKey}">100</s:Double>
<s:Double x:Key="{x:Static SystemParameters.HorizontalScrollBarThumbWidthKey}">100</s:Double>
<Style TargetType="{x:Type ScrollBar}">
<Style.Triggers>
<Trigger Property="Orientation" Value="Horizontal">
<Setter Property="Width" Value="Auto"/>
<Setter Property="Height" Value="{DynamicResource {x:Static SystemParameters.VerticalScrollBarThumbHeightKey}}"/>
</Trigger>
</Style.Triggers>
</Style>
</ScrollViewer.Resources>
<Canvas Width="600" Height="600"/>
</ScrollViewer>
你试下下这段样式代码,这是由博客园上第二种方法修改而来的,他用的是固定值100,我这里用系统资源VerticalScrollBarThumbHeightKey,你会发现,通过前面的“<s:Double x:Key="{x:Static SystemParameters.VerticalScrollBarThumbHeightKey}">100</s:Double>”的修改是有效的,但是当你把DynamicResource
改为了StaticResource后,就无效了,这是资源字典引用的一个区别,静态引用的话,就无法通过运行时修改来改变它绑定的值。故而推测你的那个Thumb的宽度、高度是静态资源引用,非动态的引用。因为无法看到原始xaml文件定义,所以这里只能是推测,希望这个说法你可以接受。
[解决办法]
放到内部就不用再引用了