【问题标题】:Conditionally set scrollbar button size有条件地设置滚动条按钮大小
【发布时间】:2014-06-24 08:16:54
【问题描述】:

我想根据条件更改应用程序中所有滚动条(箭头按钮和拇指)的大小。条件是主窗口的 ViewModel 中的布尔变量 (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-value 为 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>

有没有办法在不替换整个滚动条控件模板的情况下做到这一点?

【问题讨论】:

    标签: c# wpf triggers


    【解决方案1】:

    您可以利用LayoutTransform 来实现同样的效果

    所以只需在LayoutTransform 中使用ScaleTransform 即可完成触摸屏操作

    例如

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

    结果

    你可能会使用 as

        <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>
    

    【讨论】:

      【解决方案2】:

      为什么不直接使用值转换器绑定到值。但是,您需要在Resources 中定义您的boolToWidthConverter

      <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);
          }
      }
      

      【讨论】:

      • 我的基本问题是没有像ArrowButtonWidth这样的属性,我只能通过设置系统参数或更换控制模板来访问宽度。不过还是谢谢你的建议。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-06
      • 2015-01-02
      • 2015-01-15
      • 1970-01-01
      • 2019-08-26
      • 2011-04-13
      • 1970-01-01
      相关资源
      最近更新 更多