WPF ControlTemplate内ScrollViewer的ScrollChanged触发滚动条显隐纯XAML实现问题
纯XAML实现方案
你可以直接在ScrollViewer的ControlTemplate层级添加触发器,利用模板自身的事件监听能力和名称作用域解决问题,完全不需要修改现有架构,也不需要后台代码:
具体修改步骤
- 找到你定义的
ScrollViewer的ControlTemplate节点 - 在
<ControlTemplate TargetType="{x:Type ScrollViewer}">内部、<Grid>节点外添加ControlTemplate.Triggers节点,添加ScrollChanged事件触发器,代码如下:
<ControlTemplate TargetType="{x:Type ScrollViewer}"> <!-- 新增模板级触发器 --> <ControlTemplate.Triggers> <EventTrigger RoutedEvent="ScrollChanged"> <BeginStoryboard> <Storyboard> <!-- 滚动触发时立刻显示滚动条 --> <DoubleAnimation Duration="0:0:0" To="1" Storyboard.TargetName="PART_VerticalScrollBar" Storyboard.TargetProperty="Opacity"/> <DoubleAnimation Duration="0:0:0" To="1" Storyboard.TargetName="PART_HorizontalScrollBar" Storyboard.TargetProperty="Opacity"/> <!-- 滚动停止2秒后自动隐藏,和原有隐藏逻辑保持一致 --> <DoubleAnimation Duration="0:0:2" To="0" Storyboard.TargetName="PART_VerticalScrollBar" Storyboard.TargetProperty="Opacity" BeginTime="0:0:2"/> <DoubleAnimation Duration="0:0:2" To="0" Storyboard.TargetName="PART_HorizontalScrollBar" Storyboard.TargetProperty="Opacity" BeginTime="0:0:2"/> </Storyboard> </BeginStoryboard> </EventTrigger> </ControlTemplate.Triggers> <!-- 原有Grid代码完全保留,不需要修改 --> <Grid> <!-- 原有列定义、触发器、滚动内容、滚动条代码全部不变 --> </Grid> </ControlTemplate>
原实现失效原因说明
- 你之前把触发器加在
ScrollViewer外层节点下,和内部ControlTemplate的滚动条不属于同一个XAML名称作用域,无法找到PART_开头的滚动条元素 - 你把触发器加在
Grid内部时,ScrollChanged事件不会路由到Grid节点,所以触发器不会被触发 - 本方案利用
ControlTemplate本身的作用域,既能直接监听所属ScrollViewer的ScrollChanged事件,又能直接访问模板内部定义的命名元素,完美适配需求
内容的提问来源于stack exchange,提问作者Marcel Grüger
相关产品推荐
相关产品推荐

