2011-06-20 29 views
2

我需要在我的屏幕上绘制网格,并且每次点击用户在该特定区域绘制图像。用可点击的矩形绘制网格

我不知道如何绘制该网格。正方形将具有固定尺寸(32x32像素),但其数量可变。我可以有一个NxN单元网格。另外,这个网格需要放在一个滚动窗格中,因为它的大小是可变的。 有谁知道如何绘制该网格并获得点击方块?

我正在使用WPF。

谢谢。

回答

1

使用ScrollViewer启用滚动功能

<ScrollViewer x:Name="layoutRoot" VerticalScrollBarVisibility="Auto" HorizontalScrollBarVisibility="Auto"/> 

然后生成一个Grid对象:

private Grid GenerateGrid(int rows, int columns, int cellWidth, int cellHeight) 
{ 
    Grid grid = new Grid(); 
    grid.Width = columns * cellWidth; 
    grid.Height = rows * cellHeight; 

    for (int i = 0; i < rows; i++) 
    { 
     grid.RowDefinitions.Add(new RowDefinition()); 
    } 

    for (int i = 0; i < columns; i++) 
    { 
     grid.ColumnDefinitions.Add(new ColumnDefinition()); 
    } 

    for (int i = 0; i < rows; i++) 
    { 
     for (int j = 0; j < columns; j++) 
     { 
      var cell = new Border(); 
      cell.MouseDown += Cell_MouseDown; 
      Grid.SetRow(cell, i); 
      Grid.SetColumn(cell, j); 
      cell.Background = Brushes.Transparent; 

       cell.BorderBrush = Brushes.Gray; 
       cell.BorderThickness = new Thickness(1); 
      grid.Children.Add(cell); 
     } 
    } 

    return grid; 
} 

private void Cell_MouseDown(object sender, MouseButtonEventArgs e) 
{ 
    var cell = sender as Border; //You can use this object 
} 
+0

我明白了。谢谢你的时间。正如我看到它不打印线条,对吗?还有一个问题,正如你所看到的,我是C#的新手,我是一名Java开发人员。当鼠标被按下时,这个Cell_MouseDown会自动触发吗?如果是这样,我可以改变背景图像,如你的例子所示:)最好的问候。 – eestein

+0

yes by'cell.MouseDown + = Cell_MouseDown;'每个单元格都会触发'Cell_MouseDown'事件。对于线条简单地设置边框刷到每个单元格 –

+0

好的。我正在做的是我的java游戏的地图编辑器。我正在开发它使用WPF只是为了学习。谢谢你的帮助。最好的祝福。 – eestein

0

在我需要了解鼠标点击大多数情况下,我倾向于继承按钮。我觉得管理鼠标处理的基本事件有点令人讨厌,但这样做也会起作用,而且如果对您来说重要的话重量会更轻。无论哪种方式,如果您制作自定义或用户控件,您应该可以获得所需的一切。如果你想自己管理,你可以重写OnClick(如果你是子类Button)或OnPreviewMouseLeftButtonDown,OnPreviewMouseLeftButtonUp,OnMouseEnter和OnMouseLeave全部四个。仅捕获鼠标是不够的,因为您需要知道鼠标是否在您的控件中出现故障。我建议你观察按钮的标准点击行为来复制它,因为它有点复杂。

您可能希望查看UniformGrid以查看是否满足您的网格需求,因为您希望具有可变数量的列和行。您可以设置任意一个的数量,并且可以让孩子在他们之间流动。无论您在那里使用哪种控件,都可以放置在ScrollViewer中以获得滚动功能。

+0

使用按钮的问题是用户必须能够一次使用鼠标选择多个单元格(拖动鼠标指针)。还是不是问题? – eestein

+0

我没有意识到这是一项要求。这确实增加了足够的复杂性,因此可能需要观察鼠标事件。您应该尝试预览版本的事件,以确保在将内容添加到单元格后,您确实能够获得所期望的事件。 – dinane