0

我们的一个应用程序包含一个 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完全无关,而是一些系统配置?

问题是实际可见范围(它仍然像应有的那样滚动内容)不等于范围的值,因此,其他层在我们的应用程序中不再保持完全同步。我们已经创建了一个解决方法,但我们仍然没有预料到这一点。

4

0 回答 0