由于我的问题相当罕见,而且我没有一个线索可能导致它,我将尝试包含可能与它有关的每个代码,剥离到基本要素以避免不必要的混乱。 / p>
基本上,我有一个TabControl
,其TabItems
个Content
个人UserControl
是自定义的<UserControl>
<Grid>
<Grid.RowDefinitions>
<RowDefinition />
<RowDefinition />
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition />
<ColumnDefinition />
</Grid.ColumnDefinition>
<ScrollViewer Height="Auto" HorizontalAlignment="Stretch" Margin="0" Name="scrollViewer11" VerticalAlignment="Stretch" Width="Auto" HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Auto"></ScrollViewer>
<ScrollViewer Grid.Column="1" Height="Auto" Name="scrollViewer12" Width="Auto" Margin="0" VerticalScrollBarVisibility="Auto" HorizontalScrollBarVisibility="Auto"></ScrollViewer>
<ScrollViewer Grid.Row="1" Height="Auto" Name="scrollViewer21" Width="Auto" Margin="0" HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Auto"></ScrollViewer>
<ScrollViewer Grid.Row="1" Grid.Column="1" Height="Auto" Name="scrollViewer22" Width="Auto" Margin="0" HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Auto"></ScrollViewer>
</Grid>
</UserControl>
。
这些控件具有以下形式:
ScrollViewer
行数和列数取决于所使用的控件,范围从1x1网格中的单个单元格到3x2网格中的6个单元格(每个网格都与WriteableBitmap
相对应)。
现在我的实际C#代码。对于每个单元格,用户可以添加public partial class MainWindow : Window
{
List<WorkSpace> WorkSpaceList = new List<WorkSpace>();
private WorkSpace currentSpace = null;
//one of the methods that adds to the TabControl, here a 2x2 grid:
private void NewWorkspaceFour(WorkSpace ws)
{
WorkSpaceFour workSpaceFour = new WorkSpaceFour();
for (int i = 0; i < 4; i++)
{
WorkPlace wp = new WorkPlace();
ws.workPlaceList.Add(wp);
switch (i)
{
case 0:
workSpaceFour.scrollViewer11.Content = wp.grid;
break;
case 1:
workSpaceFour.scrollViewer12.Content = wp.grid;
break;
case 2:
workSpaceFour.scrollViewer21.Content = wp.grid;
break;
case 3:
workSpaceFour.scrollViewer22.Content = wp.grid;
break;
}
}
ws.tabItem.Content = workSpace;
tabControlImages.Items.Add(ws.tabItem);
}
//triggered in UI e.g. by moving a Slider
private void NewSettings(object sender, RoutedPropertyChangedEventArgs<double> e)
{
currentSpace.NewSettings((float)(e.NewValue));
}
}
internal class WorkSpace
{
internal delegate void NewSettingHandler(float e);
internal List<WorkPlace> workPlaceList = new List<WorkPlace>();
internal TabItem tabItem = new TabItem();
internal WorkPlace currentPlace = null;
internal NewSettingsHandler NewSettings;
internal WorkSpace()
{
NewSettings += ChangeSettings;
}
internal void ChangeSettings(float newValue)
{
//do something small with newValue
currentPlace.RecalculateImage();
}
//...more methods that would use "newValue" in a different way, thus the delegate
}
internal class WorkPlace
{
internal WriteableBitmap bitmap;
internal Image image = new Image {//settings};
internal Grid grid = new Grid {//settings};
internal Grid gridImage = new Grid {//settings};
internal WorkPlace()
{
grid.Children.Add(gridImage);
gridImage.Children.Add(image);
}
internal void RecalculateImage()
{
//some rather long calculations...
bitmap.WritePixels(...,...,...,...);
image.Source = bitmap;
}
}
,其中代码的组织如下:
currentSpace
通过该程序,用户可以更改标签以更改currentPlace
并单击单元格以更改相应的currentSpace = space
,只需更改引用即space
,其中{{1} }}指的是包含新选定WorkSpace
的{{1}}。
现在问题如下。当一个选项卡包含一个带有图像的简单1x1网格并移动滑块时,它会非常流畅地运行。当标签包含3x2网格且此网格中只有一个单元格包含TabItem
而WorkPlace
不是bitmap
时,它的工作方式相同。但是,当3x2网格完全被“绘制”null
填充并且移动滑块时,即使只重新计算了重绘的6个图像中的一个,也会出现明显的延迟。我不明白为什么会这样。它可能与渲染或对象引用有关,但我不知道C#是否足以在此处查看和发布。
希望代码不会太长(我已经尽可能地删除它)并且足够清楚。如果没有,请说出来,我会更新/添加它。在该程序的先前版本中,UI基本相同,但重新计算的图像却完全不同,但我永远无法观察到这个问题。