如何解决当鼠标悬停在内容上时,用于ItemsControl / DataTemplate的WPF ScrollViewer不会随滚轮滚动
我有一个相当复杂的WPF页面,该页面填充了层次结构形式(包含问题的部分,这些问题可能是下拉菜单,复选框等)。不同的问题类型由ContentControl
和ContentTemplateSelector
处理。
下面的代码按预期设置了页面,并为我提供了一个不错的滚动条,但是不幸的是,如果在光标位于内容上方的情况下尝试使用滚轮,则不会滚动;仅当光标位于各部分之间/两侧时滚动。
似乎我需要确保轮事件被冒起,以便ScrollViewer
可以处理它们,但是我不确定如何实现,即可以在xaml内完成还是需要被隐藏在代码后面?
任何帮助将不胜感激。
我认为这可能是xaml中最有用的部分(出于可读性考虑,请询问是否需要查看任何详细信息):
<Grid>
<DockPanel Background="{DynamicResource BackgroundColour}">
<!-- BackgroundColour is defined at runtime in Dictionary.xaml.cs -->
<Grid HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
<Grid.RowDeFinitions>
<RowDeFinition Height="Auto"></RowDeFinition>
<RowDeFinition Height="*"></RowDeFinition>
<RowDeFinition Height="Auto"></RowDeFinition>
</Grid.RowDeFinitions>
<StackPanel Grid.Row="0" HorizontalAlignment="Stretch" Height="80" VerticalAlignment="Top">...</StackPanel>
<DockPanel Grid.Row="1">
<TextBlock DockPanel.Dock="Top" FontWeight="Bold" FontSize="18" FontFamily="Verdana" Padding="20,12,8" Text="{Binding FormTemplateviewmodel.Name}"></TextBlock>
<ScrollViewer DockPanel.Dock="Top" VerticalScrollBarVisibility="Auto" >
<ItemsControl ItemsSource="{Binding Path=FormTemplateviewmodel.ObservableSectionsShowing}" BorderThickness="0">
<DataTemplate>
<Border Visibility="{Binding Path=IsShowing,Converter={StaticResource booleanToVisibilityConverter}}" BorderBrush="{DynamicResource FormBorderColour}" CornerRadius="12,12" BorderThickness="2,2,2" Margin="15,15,0" Height="Auto">
<!-- FormBorderColour and BackgroundColour are defined in Dictionary.xaml.cs -->
<DockPanel>
<TextBlock DockPanel.Dock="Top" Style="{StaticResource collapsibleTextBlock}" FontWeight="Bold" FontSize="18" FontFamily="Verdana" Padding="8,4,0" Text="{Binding Name}"></TextBlock>
<TextBlock DockPanel.Dock="Top" Style="{StaticResource collapsibleTextBlock}" Padding="8,0" Text="{Binding Path=PreText}" textwrapping="Wrap"></TextBlock>
<DataGrid DockPanel.Dock="Top" Background="{DynamicResource BackgroundColour}" CanUserAddRows="False" ItemsSource="{Binding Path=ObservableItemsShowing}" AutoGenerateColumns="False" HeadersVisibility="None" GridLinesVisibility="None" BorderThickness="0" BorderBrush="Transparent" Margin="8,8,8" Padding="8,0" Style="{StaticResource DataGridBase}">
<DataGrid.Columns>
<!-- Example of how to put a mandatory * as the first column -->
<!--<DataGridTemplateColumn IsReadOnly="True" Header="required" Width="SizetoCells" CellStyle="{StaticResource baseDataGridCell}">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<Label Visibility="{Binding Path=required,Converter={StaticResource booleanToVisibilityConverter}}">
<TextBlock Foreground="Orange" textwrapping="Wrap" Text="*" />
</Label>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>-->
<DataGridTemplateColumn IsReadOnly="True" Header="Name" Width="1*" CellStyle="{StaticResource baseDataGridCell}">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<Label>
<TextBlock textwrapping="Wrap" Text="{Binding Path=FirstObservationType.Name}" />
</Label>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTemplateColumn Header="PrevValue" IsReadOnly="True" Width="1*" CellStyle="{StaticResource rightAlignDataGridCell}">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<Label>...</Label>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTemplateColumn Header="Answer" Width="3*" CellStyle="{StaticResource rightAlignDataGridCell}">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<ContentControl Name="ccoptionSelector" Content="{Binding}" ContentTemplateSelector="{DynamicResource MyTemplateSelector}"></ContentControl>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTemplateColumn IsReadOnly="True" Header="Unit" Width="Auto" CellStyle="{StaticResource baseDataGridCell}">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<Label>
<TextBlock textwrapping="Wrap" Text="{Binding Path=FirstObservationType.UnitText}" />
</Label>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>
<TextBlock DockPanel.Dock="Top" Style="{StaticResource collapsibleTextBlock}" Padding="8" Text="{Binding Path=PostText}" textwrapping="Wrap"></TextBlock>
</DockPanel>
</Border>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</ScrollViewer>
</DockPanel>
<StackPanel Grid.Row="2" Orientation="Horizontal" HorizontalAlignment="Right" Margin="0,10">...</StackPanel>
</Grid>
</DockPanel>
</Grid>
典型的DataTemplate如下所示,在ResourceDictionary中定义(与上述相同的xaml文件中):
<DataTemplate x:Key="checkBoxOptionDataTemplate" DataType="{x:Type bm:ObservationTypeviewmodel}">
<CheckBox IsEnabled="{Binding Path=FirstObservationType.IsEnabled}" IsChecked="{Binding Path=FirstObservationType.CheckBoxValue,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}">
<CheckBox.Resources>
<local:BindingProxy x:Key="proxy" Data="{Binding FirstObservationType}" />
</CheckBox.Resources>
</CheckBox>
</DataTemplate>
我尝试使用以下方法,但没有用:
<!--<ItemsControl.Template>
<ControlTemplate targettype="{x:Type ItemsControl}">
<ScrollViewer CanContentScroll="True" VerticalScrollBarVisibility="Auto" HorizontalScrollBarVisibility="Auto">
<ItemsPresenter></ItemsPresenter>
</ScrollViewer>
</ControlTemplate>
</ItemsControl.Template>-->
<!--For padding between sections-->
<ItemsControl.ItemContainerStyle>
<Style>
<Setter Property="FrameworkElement.Margin" Value="2,2"/>
</Style>
</ItemsControl.ItemContainerStyle>
<ItemsControl.ItemTemplate>
public override DataTemplate SelectTemplate(object sender,DependencyObject container)
{
if (!(container is FrameworkElement elem)) return null;
var formItem = elem.BindingGroup.Items.Cast<FormItemviewmodel>().FirstOrDefault();
if (formItem == null || formItem.ObservableObsTypes == null || formItem.ObservableObsTypes.Count() == 0) return elem.FindResource("defaultOptionDataTemplate") as DataTemplate;
if (!(formItem.ObservableObsTypes.FirstOrDefault() is ObservationTypeviewmodel item))
{
throw new ApplicationException();
}
switch (item.Type)
{
...
case "checkBox": return elem.FindResource("checkBoxOptionDataTemplate") as DataTemplate;
...
default: return elem.FindResource("defaultOptionDataTemplate") as DataTemplate;
}
}
谢谢卢克
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。