Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
WPF虚拟化项控件滚动已更改.Net 4.5中的行为是否已更改?_.net_Wpf_Itemscontrol_Scrollviewer_Virtualizingstackpanel - Fatal编程技术网

WPF虚拟化项控件滚动已更改.Net 4.5中的行为是否已更改?

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

我们的一个应用程序包含一个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:

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上那样运行。。。哦,好吧,至少到目前为止我们的解决方案似乎还有效,但我希望我们不会遇到其他类似的问题。。。