2013-02-26 63 views
0

我目前在C#WPF 4.5中工作,并试图创建一个交互式网格。给定网格单元格的大小(宽度=高度),列数和行数,我想在屏幕上动态生成网格。交互式网格WPF

对于生成的网格,我希望网格线可见。我想这可以通过在每个单元格中绘制边框来模拟,如果没有其他的话。除此之外,我需要一个事件来确定用户单击哪个单元格(即点击返回网格列和行),并且一次选择一个或多个单元格。

任何关于如何创建类似的东西或想法的帮助或想法,还是有更好的方法去解决它?提前致谢!

编辑: 因此,这里的一些进展,我做了:

  1. 创建一个自定义的复选框:

    <Style x:Key="styleCustomCheckBox" TargetType="{x:Type CheckBox}"> 
        <Setter Property="Template"> 
         <Setter.Value> 
          <ControlTemplate TargetType="{x:Type CheckBox}"> 
           <Grid x:Name="Background" Background="Transparent"> 
            <Rectangle x:Name="fillCheckBox"/> 
           </Grid> 
           <ControlTemplate.Triggers> 
            <Trigger Property="IsChecked" Value="False"> 
             <Setter TargetName="fillCheckBox" Property="Fill" Value="Transparent"/> 
            </Trigger> 
            <Trigger Property="IsChecked" Value="True"> 
             <Setter TargetName="fillCheckBox" Property="Fill" Value="Red"/> 
             <Setter TargetName="fillCheckBox" Property="Opacity" Value=".3"/> 
            </Trigger> 
           </ControlTemplate.Triggers> 
          </ControlTemplate> 
         </Setter.Value> 
        </Setter> 
    </Style> 
    

然后就是填充网格的,自定义复选框款式:

<CheckBox Grid.Column="1" Grid.Row="1" Style="{StaticResource styleCustomCheckBox}" /> 

所以现在我想映射网格中的每个复选框,我可以收集复选框是否被选中以及网格的行和列是什么,我将如何去做这件事?

+0

蓝色边框是默认'ListBox'风格的一部分。你可以很容易地改变它。 – 2013-02-26 03:30:55

回答

2

我会用其ItemsPanelTemplate设置ItemsControlUniformGrid,这是ItemTemplate设置为您的CheckBox

这将是最简单的,如果你能在你的代码绑定您的ItemsControl.ItemsSource数据对象的集合后面。例如:

<ItemsControl ItemsSource="{Binding MyCollection}"> 
    <!-- ItemsPanelTemplate --> 
    <ItemsControl.ItemsPanel> 
     <ItemsPanelTemplate> 
      <UniformGrid Rows="5" Columns="5" /> 
     </ItemsPanelTemplate> 
    </ItemsControl.ItemsPanel> 

    <!-- ItemTemplate --> 
    <ItemsControl.ItemTemplate> 
     <DataTemplate> 
      <Border BorderBrush="Red" BorderThickness="1"> 
       <CheckBox Style="{StaticResource styleCustomCheckBox}" /> 
      </Border> 
     </DataTemplate> 
    </ItemsControl.ItemTemplate> 
</ItemsControl> 

如果你需要指定检查项目的行或列的索引,你可以添加到您的数据项,并使用常规Grid代替UniformGrid的,并应用ItemContainerStyle是这样的:

<!-- ItemContainerStyle --> 
<ItemsControl.ItemContainerStyle> 
    <Style> 
     <Setter Property="Grid.Column" Value="{Binding ColumnIndex}" /> 
     <Setter Property="Grid.Row" Value="{Binding RowIndex}" /> 
    </Style> 
</ItemsControl.ItemContainerStyle> 

确定点击的项目,这取决于你如何构建你的数据对象,你实际上想要做什么在你的点击。

如果你想在广场后面的数据项,你可以只使用DataContext,如

void MyCheckBox_Clicked(object sender, EventArgs e) 
{ 
    var selectedItem = ((CheckBox)sender).DataContext; 
} 

或者,如果你有这样的事情一个数据项与IsChecked属性是这样的:

<CheckBox IsChecked="{Binding IsChecked}" 
      Style="{StaticResource styleCustomCheckBox}" /> 

您可以轻松地将事件附加到数据项目IsChecked属性的PropertyChanged事件中,并在该处运行一些代码。

第三种方法,你可以用你ItemTemplate一个Button,并通过所选择的项目作为CommandParameter

<Border BorderBrush="Red" BorderThickness="1"> 
    <Button CommandParameter="{Binding }" ... /> 
</Border> 

我不能给你一个明确的答案,因为我不知道你的代码库和你想做什么,但我希望这给你足够的信息,给你一个粗略的开始,并指出你的方向正确的方向。

+0

非常感谢! – Reosoul 2013-02-28 20:13:19