アプリケーションの1つにUserControlが含まれており、スクロール時に同期が保たれるItemsControlの複数のレイヤーがあります。ItemsControlは仮想化されています。アプリケーションは4.5ではなく.Net4.0を対象としており、.NetFramework4.0がインストールされているシステムで制御は正常に機能します。ただし、現在.Net Framework 4.5もインストールされているPCがあり、100%下位互換性がないようです(またはシステムに別の問題があります)。
4.0では、同じ4.0アプリケーションを4.5がインストールされているシステムでは、スクロールバーをクリックしてマウスを押したまま移動すると、値が10進数に設定されるようです。
コントロールのサブセットであるこの小さなテストウィンドウでそれを再現しました。.Net 4.0のみを搭載したPCで実行すると、MesasgeBoxに整数値のみが表示されますが、.net 4.5がインストールされたPCでは、10進値も表示されます。
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とはまったく関係がなく、代わりに一部のシステム構成の問題ですか?
問題は、実際に表示される範囲(コンテンツを本来のようにスクロールする)が範囲の値と等しくないため、アプリケーションで他のレイヤーが正確に同期されていないことです。回避策を作成しましたが、それでもこれは予期していませんでした。