2012-03-28 47 views
1

我有一個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> 

從包含視圖模型,在問題

循環3210
private 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> 
+0

上下文菜單是做什麼的? – Paparazzi 2012-03-28 21:03:14

+0

在BlankVM單元格上,我可以將實際內容添加到該網格單元格中... – Kage 2012-03-28 22:41:03

+0

您可以發佈視圖和視圖模型的示例嗎? – KodeKreachor 2012-03-28 22:51:23

回答

0

與thise一些搞砸。

由於網格單元格是一個已知的,固定大小的,使用過的MouseMove事件處理程序來計算鼠標所在的單元格,並在網格本身上使用了一個上下文菜單。

相關問題