整个早上我都在用头撞这个问题。
基本上,我有一个列表框,我希望防止人们在长时间运行的过程中更改选择,但允许他们仍然滚动。
解决方案:
所有的答案都很好,我选择了吞咽鼠标事件,因为这是最直接的。我将 PreviewMouseDown 和 PreviewMouseUp 连接到一个事件,该事件检查了我的 backgroundWorker.IsBusy,以及是否将事件参数上的 IsHandled 属性设置为 true。
如果你查看ListBox的控件模板,里面有一个ScrollBar和ItemsPresenter。因此,禁用 ItemsPresenter 就可以轻松实现这一点。在列表框中使用以下样式就可以了。
<Style x:Key="disabledListBoxWithScroll" TargetType="{x:Type ListBox}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type ListBox}">
<Border x:Name="Bd" SnapsToDevicePixels="true" Background="{TemplateBinding Background}" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Padding="1">
<ScrollViewer Padding="{TemplateBinding Padding}" Focusable="false">
<ItemsPresenter SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" IsEnabled="False" IsHitTestVisible="True"/>
</ScrollViewer>
</Border>
<ControlTemplate.Triggers>
<Trigger Property="IsEnabled" Value="false">
<Setter Property="Background" TargetName="Bd" Value="{DynamicResource {x:Static SystemColors.ControlBrushKey}}"/>
</Trigger>
<Trigger Property="IsGrouping" Value="true">
<Setter Property="ScrollViewer.CanContentScroll" Value="false"/>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
在列表框中使用样式
<ListBox Style="{DynamicResource disabledListBoxWithScroll}" ..... />
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)