增强控件

WPF Suite 对于大部分控件都有进行属性拓展, 包括状态属性, 圆角设置, 部分控件还进行了功能拓展


状态属性

你会在增强的控件中, 多了一些属性, 例如 HoverBackground, HoverBorderBrush, 正如其名, 它们表示在对应状态下对应属性的值.

如果对这些属性设置了 null, 也会正确的 fallback 到设定的 BackgroundBorderBrush 属性值.

也就是说, 你不需要更改模板, 就可以直接设定控件在某状态下的某种样式.

使用示例

<ws:Button Content="TextButton" 
           Padding="4"
           BorderBrush="Transparent"
           Background="Transparent"
           HoverBorderBrush="#33000000"
           HoverBackground="#EEFFFFFF"
           PressedBackground="#c8f8ff"/>

效果, 非悬停状态, 悬停状态以及按下状态:

圆角

现在 Button, TextBox, PasswordBox 以及绝大部分控件都支持使用 CornerRadius 来设置圆角

使用示例

<ws:StackPanel Orientation="Horizontal"
               Spacing="4">
    <ws:Button Content="Button"
               CornerRadius="10"/>
    <ws:TextBox MinWidth="60"
                CornerRadius="10"/>
    <ws:PasswordBox MinWidth="60"
                    CornerRadius="10"/>
</ws:StackPanel>

CornerRadius 示例效果

占位符

TextBox 和 PasswordBox 现在可以通过 Placeholder 属性来设置占位符. 占位符会在文本框为空的时候显示.

使用示例

<ws:StackPanel Spacing="4">
    <ws:TextBox Placeholder="This is a text box"/>
    <ws:PasswordBox Placeholder="This is a password box"/>
</ws:StackPanel>

Placeholder 示例效果

圆角裁剪

BorderClipToBounds 设为 true, 即可裁剪掉超出 Border 范围的部分.

使用实例:

<ws:Border ClipToBounds="True" 
           CornerRadius="40 30 20 10"
           Width="200">
    <Image Source="/Assets/TestImage2.jpg"/>
</ws:Border>

圆角裁剪示例效果1

但如果 Border 带有边框, 其内容仍然会遮盖住边框部分:

圆角裁剪示例效果2

此时, 我们可以借助 BorderContentAdapter 来帮助裁剪超出边框内边缘的部分:

<ws:Border ClipToBounds="True" 
           CornerRadius="40 30 20 10"
           BorderBrush="Firebrick"
           BorderThickness="5"
           Width="200">
    <ws:BorderContentAdapter>
        <Image Source="/Assets/TestImage2.jpg"/>
    </ws:BorderContentAdapter>
</ws:Border>

圆角裁剪示例效果3

或者通过绑定内容的 ClipBorderContentClip 属性, 也可以自动裁剪超出边框内边缘的部分. 效果是完全一致的.

<ws:Border ClipToBounds="True" 
           CornerRadius="40 30 20 10"
           BorderBrush="Firebrick"
           BorderThickness="5"
           Width="200">
    <Image Source="/Assets/TestImage2.jpg"
           Clip="{Binding RelativeSource={RelativeSource AncestorType=ws:Border},Path=ContentClip}"/>
</ws:Border>

圆角裁剪示例效果

BorderContentAdapter 不仅可以在 EleCho.WpfSuite 的 Border 中使用, 也可以在 WPF 内置的 Border 中使用, 都可以将内容正确裁剪调.

平滑滚动

如果你使用 WPF Suite 提供的 ScrollViewer, 那么对于使用鼠标的内容滚动, 会有更平滑的效果.

附加属性 类型 描述
ScrollWithWheelDelta bool 通过 Wheel 事件的 delta 值决定滚动距离, 此选项用于优化滚动效果, 默认为 true
EnableScrollingAnimation bool 启用滚动动画, 决定使用鼠标进行滚动时是否使用缓动的效果, 默认为 true, 并且此选项要求 ScrollWithWheelDelta 设为 true, 否则不起作用
ScrollingAnimationDuration Duration 滚动动画的时长, 默认为 250ms
MouseScrollDeltaFactor double 当使用鼠标进行滚动时, 滚动 Delta 值的乘数. 改变此值可以变更滚动速度与方向, 默认为 1
TouchpadScrollDeltaFactor double 当使用触摸板进行滚动时, 滚动 Delta 值的乘数. 改变此值可以变更滚动速度与方向, 默认为 1
AlwaysHandleMouseWheelScrolling bool 总是处理鼠标 Wheel 事件的滚动, 当鼠标滚轮滚动时则滚动 ScrollViewer 内容. 默认为 true

将 AlwaysHandleMouseWheelScrolling 设置为 false 时, ScrollViewer 的平滑滚动效果将不会应用于 TextBox 上

使用示例:

<ws:ScrollViewer>
    省略内容...
</ws:ScrollViewer>

ScrollViewer 示例效果

触摸模拟

原生的 WPF 是无法使用笔对 ScrollViewer 进行滚动的, 如果你想要通过笔来滚动, 可以使用 “触摸设备模拟”. 通过笔来模拟一个触摸设备, 实现笔滚动.

附加属性 类型 描述
StylusTouchDevice.Simulate bool 是否将笔模拟为触摸设备, 默认为 false
StylusTouchDevice.MoveThreshold double 移动阈值, 笔在移动超过指定的距离之后, 才会将移动汇报为触摸移动, 默认为 3
MouseTouchDevice.Simulate bool 是否将鼠标模拟为触摸设备, 默认为 false
MouseTouchDevice.MoveThreshold double 移动阈值, 笔在移动超过指定的距离之后, 才会将移动汇报为触摸移动, 默认为 3

如果你将移动阈值设为 0, 那么你将无法通过笔来进行点击 ScrollViewer 内的控件, 因为笔总是存在抖动的, 触摸移动会进行 ScrollViewer 的滚动, 从而打断点击这一动作.

所以, 根据你想要的 “精度”, 适当调整 “移动阈值”. (很多程序对于这个都有一个较大的阈值, 例如 5px, 甚至 10px 或更多)

使用示例:

<ws:ScrollViewer PanningMode="Both"
                 ws:MouseTouchDevice.Simulate="True">
    省略内容...
</ws:ScrollViewer>

模拟触摸示例效果