Sorry for the delay - have been away for long weekend. The code that I would use is similar to yours (just does not involve the Timer). It does need .NET 3.5 SP1 to use the Dispatcher code.
private void ApplyData(DataLoaderResult dataLoaderResult)
{
//Where you currently get the offsets call this...
GetAndSetScrollViwerOffsets(DispatcherPriority.Loaded);
// ... some code skipped ...
DataGrid.ItemsSource = FDataView.PlainView;
}
internal void GetAndSetScrollViwerOffsets(DispatcherPriority dispatcherPriority)
{
double dVerticalOffset = 0.0;
double dHorizontalOffset = 0.0;
GetScrollViewerOffsets(ref dVerticalOffset, ref dHorizontalOffset);
Dispatcher.BeginInvoke((Action)(() => SetScrollViewerOffsets(dVerticalOffset, dHorizontalOffset)), dispatcherPriority, null);
}
private void GetScrollViewerOffsets(ref double dVerticalOffset, ref double dHorizontalOffset)
{
dVerticalOffset = 0.0;
dHorizontalOffset = 0.0;
ScrollViewer sv = Template.FindName("PART_ScrollViewer", this) as ScrollViewer;
if (sv != null)
{
dVerticalOffset = sv.VerticalOffset;
dHorizontalOffset = sv.HorizontalOffset;
}
}
private void SetScrollViewerOffsets(double dVerticalOffset, double dHorizontalOffset)
{
if (dVerticalOffset >= 0.0 || dHorizontalOffset >= 0.0)
{
ScrollViewer sv = Template.FindName("PART_ScrollViewer", this) as ScrollViewer;
if (sv != null)
{
if (dVerticalOffset > sv.ScrollableHeight)
{
sv.ScrollToVerticalOffset(sv.ScrollableHeight);
}
else
{
sv.ScrollToVerticalOffset(dVerticalOffset);
}
if (dHorizontalOffset > sv.ScrollableWidth)
{
sv.ScrollToHorizontalOffset(sv.ScrollableWidth);
}
else
{
sv.ScrollToHorizontalOffset(dHorizontalOffset);
}
}
}
}