我们的一个应用程序包含一个 UserControl,其中我们有多个 ItemsControls 层,它们在滚动时保持同步。ItemsControl 是虚拟化的。该应用程序的目标是 .Net 4.0,而不是 4.5,并且该控件在安装了 .Net Framework 4.0 的系统上运行良好。然而,我们现在有一台安装了 .Net Framework 4.5 的电脑,它似乎不是 100% 向后兼容(或者系统存在另一个问题)。
发生的情况是,在 4.0 中,任何滚动(鼠标滚轮/箭头、移动滚动条)将 ScrollChanged 事件的 ExtentHeight 设置为整数值(因为它是虚拟化的并且 CanContentScroll 为真),同时在 a 上运行相同的 4.0 应用程序安装了 4.5 的系统,似乎在通过单击并按住鼠标移动滚动条时将值设置为十进制值。
我们已经用这个小测试窗口重现了它,它是我们控件的一个子集。在仅安装了 .Net 4.0 的 PC 上运行它只会在 MesasgeBox 中显示整数值,而在安装了 .net 4.5 的 PC 上,它还会显示十进制值。
MainWindow.xaml.cs:
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
this.DataContext = new int[1000];
for (int i = 0; i < 1000; i++)
{
(this.DataContext as int[])[i] = i;
}
}
private void ScrollViewer_ScrollChanged_1(object sender, System.Windows.Controls.ScrollChangedEventArgs e)
{
MessageBox.Show(string.Empty + e.VerticalOffset);
}
}
MainWindow.xaml:
<Grid>
<ItemsControl
VirtualizingStackPanel.IsVirtualizing="True"
ScrollViewer.CanContentScroll="True"
ItemsSource="{Binding}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<Border Background="Orange" BorderBrush="LightGray" BorderThickness="1" Height="50">
<TextBlock Text="{Binding}" />
</Border>
</DataTemplate>
</ItemsControl.ItemTemplate>
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<VirtualizingStackPanel />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.Template>
<ControlTemplate>
<Border BorderThickness="{TemplateBinding Border.BorderThickness}" Padding="{TemplateBinding Control.Padding}"
BorderBrush="{TemplateBinding Border.BorderBrush}" Background="{TemplateBinding Panel.Background}"
SnapsToDevicePixels="True">
<Grid>
<ScrollViewer x:Name="TimelineScrollViewer" Padding="{TemplateBinding Control.Padding}" Focusable="False" Grid.ColumnSpan="2" Grid.RowSpan="2"
ScrollChanged="ScrollViewer_ScrollChanged_1">
<ScrollViewer.Style>
<Style TargetType="ScrollViewer">
<Setter Property="HorizontalScrollBarVisibility" Value="Disabled" />
<Setter Property="VerticalScrollBarVisibility" Value="Visible" />
</Style>
</ScrollViewer.Style>
<ItemsPresenter SnapsToDevicePixels="{TemplateBinding UIElement.SnapsToDevicePixels}" x:Name="TimelineItemsPresenter" />
</ScrollViewer>
</Grid>
</Border>
</ControlTemplate>
</ItemsControl.Template>
</ItemsControl>
</Grid>
这是一个错误还是记录在某处?这是.Net 4.5的向后兼容性问题,还是实际上与4.5完全无关,而是一些系统配置?
问题是实际可见范围(它仍然像应有的那样滚动内容)不等于范围的值,因此,其他层在我们的应用程序中不再保持完全同步。我们已经创建了一个解决方法,但我们仍然没有预料到这一点。