我有一個ItemsControl綁定到極其基本的ViewModel集合,每個集合都有一個行\ col Postion屬性。我也使用Caliburn.Micro MVVM框架,它會自動使用匹配的視圖(這只是一個簡單的矩形,具有Fill =「Transparent」)我在開始時使用這些填充網格,所以我可以添加ContextMenus給他們,並知道單元格被點擊了什麼等。如何在向每個網格「單元格」添加內容時提高性能
ItemsPanelTemplate是一個Grid,ItemContainerStyle綁定Grid.Row \ Column到Position.X \ Y屬性。
此屏幕是一個屏幕編輯器,用於模擬舊的80x25文本模式系統,最初使用自定義光柵字體來繪製一些簡單的圖形。原始系統可以處理8個屏幕。我使用矩形和矢量圖形來提高靈活性,並將屏幕尺寸擴大至任意尺寸。
第一個想法是簡單地通過網格對於(i){for(j){Add}}循環,併爲每個單元添加一個新的BlankVM。
它的工作原理,但它必須做2000次,這是非常緩慢的。綁定等是很快的,但它增加了很多。由於潛在的屏幕尺寸可能需要儘可能大,因此 會窒息。現在約40多秒。
我不是一個偉大的程序員(還!),所以我不知所措。
我可以用更高效的東西替換for循環嗎?
由於BlankCells除了位置(行,列)以外都是相同的,我可以利用它嗎?
也許我甚至都不需要被添加所有這些到電網,如果有一個更簡單的方法,以便能夠使用contextmenus,知道我一下什麼細胞...
這裏的驗證碼:
public class BlankCellViewModel : PropertyChangedBase, IEditorCell
{
public GridPosition Position { get; set; }
public BlankCellViewModel(GridPosition position) {
Position = position;
}
}
和視圖
<UserControl x:Class="EditorCells.BlankCellView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<Rectangle>
<Rectangle.ContextMenu>
<ContextMenu>
<MenuItem Header="New Track Segment Here" />
</ContextMenu>
</Rectangle.ContextMenu>
<Rectangle.Style>
<Style>
<Setter Property="Rectangle.Fill"
Value="Transparent" />
<Style.Triggers>
<Trigger Property="Rectangle.IsMouseOver"
Value="True">
<Setter Property="Rectangle.Fill"
Value="White" />
</Trigger>
</Style.Triggers>
</Style>
</Rectangle.Style>
</Rectangle>
</UserControl>
從包含視圖模型,在問題
循環3210private void SetupEditorGrid()
{
EditorMap.Resize(MaxRow, MaxColumn);
for (int i = 0; i < MaxRow; i++)
{
for (int j = 0; j < MaxColumn; j++)
{
AddCell(new BlankCellViewModel(new GridPosition(j, i)));
}
}
}
及其觀點:
<UserControl x:Class="EditorView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:ap="clr-namespace:Support.AttachedProperties;assembly=Systems"
HorizontalAlignment="Center">
<ItemsControl x:Name="EditorCells">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<Grid ShowGridLines="True"
Background="Black"
HorizontalAlignment="Center"
VerticalAlignment="Center"
ap:GridHelpers.RowCount="{Binding RowCount}"
ap:GridHelpers.ColumnCount="{Binding ColumnCount}" >
<Grid.Resources>
<Style TargetType="{x:Type ColumnDefinition}">
<Setter Property="Width"
Value="8" />
</Style>
<Style TargetType="{x:Type RowDefinition}">
<Setter Property="Height"
Value="16" />
</Style>
</Grid.Resources>
</Grid>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemContainerStyle>
<Style>
<Setter Property="Grid.Row"
Value="{Binding Position.Row}" />
<Setter Property="Grid.Column"
Value="{Binding Position.Column}" />
</Style>
</ItemsControl.ItemContainerStyle>
</ItemsControl>
</UserControl>
上下文菜單是做什麼的? – Paparazzi 2012-03-28 21:03:14
在BlankVM單元格上,我可以將實際內容添加到該網格單元格中... – Kage 2012-03-28 22:41:03
您可以發佈視圖和視圖模型的示例嗎? – KodeKreachor 2012-03-28 22:51:23