WPF虚拟化项控件滚动已更改.Net 4.5中的行为是否已更改?
我们的一个应用程序包含一个UserControl,其中有多个ItemsControl层,在滚动时保持同步。ItemsControl已虚拟化。该应用程序针对的是.Net 4.0,而不是4.5,并且该控件在安装了.Net Framework 4.0的系统上运行良好。然而,我们现在有一台安装了.Net Framework 4.5的pc,它似乎不是100%向后兼容(或者系统还有另一个问题) 在4.0中,当在安装了4.5的系统上运行相同的4.0应用程序时,任何滚动(鼠标滚轮/箭头、移动滚动条)都会将ScrollChanged事件的ExtentheLight设置为整数值(虚拟化,CanContentScroll为true),通过单击滚动条并按住鼠标移动滚动条时,似乎会将该值设置为十进制值 我们用这个小测试窗口复制了它,它是我们控件的一个子集。在仅安装.Net 4.0的PC上运行它时,MesasgeBox中仅显示整数值,而在安装.Net 4.5的PC上,它还显示十进制值 MainWindow.xaml.cs:WPF虚拟化项控件滚动已更改.Net 4.5中的行为是否已更改?,.net,wpf,itemscontrol,scrollviewer,virtualizingstackpanel,.net,Wpf,Itemscontrol,Scrollviewer,Virtualizingstackpanel,我们的一个应用程序包含一个UserControl,其中有多个ItemsControl层,在滚动时保持同步。ItemsControl已虚拟化。该应用程序针对的是.Net 4.0,而不是4.5,并且该控件在安装了.Net Framework 4.0的系统上运行良好。然而,我们现在有一台安装了.Net Framework 4.5的pc,它似乎不是100%向后兼容(或者系统还有另一个问题) 在4.0中,当在安装了4.5的系统上运行相同的4.0应用程序时,任何滚动(鼠标滚轮/箭头、移动滚动条)都会将Scr
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);
}
}
公共部分类主窗口:窗口
{
公共主窗口()
{
初始化组件();
this.DataContext=newint[1000];
对于(int i=0;i<1000;i++)
{
(this.DataContext作为int[])[i]=i;
}
}
私有无效ScrollViewer_ScrollChanged_1(对象发送器,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>
这是一个bug还是有文档记录?这是一个.Net 4.5的向后兼容性问题,还是实际上与4.5完全无关,而是与某些系统配置有关
问题是,实际的可见范围(它仍然像它应该的那样滚动内容)不等于范围的值,因此,其他层在我们的应用程序中不再保持完全同步。我们已经创建了一个解决方案,但我们仍然没有预料到这一点。如果您的项目以.NET 4为目标,并且您在安装了.NET 4.5的计算机上运行它,则即使您不是以.NET 4.5为目标,在.NET 4.5中所做的更改仍将应用。因此,您基本上需要在只有.NET4的机器上进行测试。有关更多信息,请参阅线程。感谢您的回复,这似乎确实是我们的问题。显然,在.Net Framework 4.0中感觉像逻辑行为的东西实际上应该是一个bug,并且在.Net Framework 4.5中得到了修复,因此,我的.Net Framework 4.0应用程序在不同的机器上运行的方式不同?见鬼,在XP/Vista机器上,它甚至不能像在7/8上那样运行。。。哦,好吧,至少到目前为止我们的解决方案似乎还有效,但我希望我们不会遇到其他类似的问题。。。