我们有UserControl
显示RadioButton
中表示为ListBox
的枚举的所有可能值,以选择其中之一。当此控件位于带有其他控件(如文本框或其他任何控件)的ScrollViewer
内时,如果鼠标光标位于EnumBox上,则不会滚动窗体的ScrollViewer
。
这就是在UI中的样子:
为了演示RadioButton
有黄色背景,WrapPanel
的背景为绿色。当鼠标光标位于彩色区域内时(例如在WrapPanel
内),滚动鼠标滚轮无效。
EnumBox的模板如下所示:
<UserControl.Template>
<ControlTemplate TargetType="{x:Type clientsWpf:EnumBox}">
<StackPanel>
<GroupBox Header="{Binding Header, RelativeSource={RelativeSource AncestorType={x:Type clientsWpf:EnumBox}}}" IsReadOnly="{Binding IsReadOnly, RelativeSource={RelativeSource AncestorType={x:Type clientsWpf:EnumBox}}}">
<Border x:Name="InvalidBorder" BorderBrush="Red" BorderThickness="0" >
<ListBox x:Name="PART_ListBox" HorizontalAlignment="Left" KeyboardNavigation.DirectionalNavigation="Cycle" Background="Transparent" BorderThickness="0" SelectedValuePath="." SelectedValue="{Binding Path=SelectedValue, RelativeSource={RelativeSource AncestorType={x:Type clientsWpf:EnumBox}}}" ScrollViewer.HorizontalScrollBarVisibility="Disabled">
<ListBox.ItemsPanel>
<ItemsPanelTemplate>
<WrapPanel Orientation="Horizontal" Background="Green"/>
</ItemsPanelTemplate>
</ListBox.ItemsPanel>
<ListBox.Resources>
<Style x:Key="{x:Type ListBoxItem}" TargetType="{x:Type ListBoxItem}" >
<Setter Property="Template">
<Setter.Value>
<ControlTemplate>
<Border Background="Transparent" Background="Yellow">
<RadioButton Margin="3" Focusable="False" Content="{TemplateBinding ContentControl.Content,Converter={StaticResource enumValueDescriptionConverter}}"
IsChecked="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListBoxItem}},Path=IsSelected}" />
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</ListBox.Resources>
</ListBox>
</Border>
</GroupBox>
</StackPanel>
</ControlTemplate>
</UserControl.Template>
我尝试在ScrollViewer.VerticalScrollBarVisibility="Disabled"
,ScrollViewer.CanContentScroll="False"
,ListBox
及其WrapPanel
上设置RadioButton
和Border
,但不起作用。
我尝试在所有四个控件上捕获ScrollBar.Scroll="WrapPanel_Scroll"
事件,但没有一个被击中。
我尝试在SelectiveScrollingGrid.SelectiveScrollingOrientation="None"
上设置RadioButton
但没有效果。
有没有人知道阻止用户界面滚动的内容?
要说清楚:它不是要在EnumBox中滚动,而是滚动整个表单。
答案 0 :(得分:3)
问题是ListBox
有自己的ScrollViewer
。复制ListBox
的模板,然后移除嵌入的ScrollViewer
。
以下是嵌入式ScrollViewer
注释掉的完整示例:
<Window x:Class="WpfApplication1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<Window.Resources>
<SolidColorBrush x:Key="ListBorder" Color="#828790"/>
<Style x:Key="ListBoxStyleNoScrollViewer" TargetType="{x:Type ListBox}">
<Setter Property="Background" Value="{DynamicResource {x:Static SystemColors.WindowBrushKey}}"/>
<Setter Property="BorderBrush" Value="{StaticResource ListBorder}"/>
<Setter Property="BorderThickness" Value="1"/>
<Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}"/>
<Setter Property="ScrollViewer.HorizontalScrollBarVisibility" Value="Auto"/>
<Setter Property="ScrollViewer.VerticalScrollBarVisibility" Value="Auto"/>
<Setter Property="ScrollViewer.CanContentScroll" Value="true"/>
<Setter Property="ScrollViewer.PanningMode" Value="Both"/>
<Setter Property="Stylus.IsFlicksEnabled" Value="False"/>
<Setter Property="VerticalContentAlignment" Value="Center"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type ListBox}">
<Border x:Name="Bd" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" Padding="1" SnapsToDevicePixels="true">
<!--<ScrollViewer Focusable="false" Padding="{TemplateBinding Padding}">-->
<ItemsPresenter SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/>
<!--</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>
</Window.Resources>
<ScrollViewer>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="200"/>
<RowDefinition Height="100"/>
<RowDefinition Height="200"/>
</Grid.RowDefinitions>
<ListBox Grid.Row="1" Style="{StaticResource ListBoxStyleNoScrollViewer}" >
<ListBox.Items>
<ListBoxItem>One</ListBoxItem>
<ListBoxItem>Two</ListBoxItem>
<ListBoxItem>Three</ListBoxItem>
<ListBoxItem>Four</ListBoxItem>
</ListBox.Items>
</ListBox>
</Grid>
</ScrollViewer>
</Window>
如果列表框中有Style="{StaticResource ListBoxStyleNoScrollViewer}"
,则滚动条在列表框上方时会起作用。如果没有,那么样本就会出现你提到的问题。
答案 1 :(得分:0)
我认为您的问题是您在ListBox
,Border
等处将背景设置为透明。它会阻止它接收焦点以及鼠标事件。给你的ListBox
一种颜色,但是在它上面翻转一部分RGBA ..试试这个例如:#000A0A09(它的黑色,A = 0%,这使它看起来透明)