让Silverlight DataGridCell内容填充单元格?

时间:2015-02-06 00:47:02

标签: wpf silverlight datagrid silverlight-4.0

我正在尝试识别DataGrid中每个单元格上的MouseLeftButtonDown,但有两件事阻止了我:

  • DataGridCell不会触发点击事件
  • 使用网格(带有点击事件)作为子元素不会填充单元格,因此只能点击其自动调整大小以适合其内容的内容。

这是我的手机模板:

    <DataTemplate x:Key="...">
    <Grid MouseLeftButtonDown="..."
          VerticalAlignment="Stretch"
          HorizontalAlignment="Stretch">
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="*"/>
        </Grid.ColumnDefinitions>
        <Image     HorizontalAlignment="Center"
                   VerticalAlignment="Center"
                   Width="24" Height="24"
                   Source="..."/>
    </Grid>
    </DataTemplate>

行高/列宽意味着单元格高64像素,宽80像素,并且可调整大小,因此内部的24x24图像是潜在大单元格中唯一可点击的部分。 DataGridCell本身的样式如下:

    <Style TargetType="data:DataGridCell" x:Key="...">
      <Setter Property="Height" Value="64"/>
      <Setter Property="HorizontalContentAlignment" Value="Stretch"/>
      <Setter Property="VerticalContentAlignment" Value="Stretch"/>
    </Style>

理想情况下,网格应扩展到包含单元格的大小。但无论我将对齐属​​性指定多长时间进行拉伸,它都不会成功。您可以通过设置网格的背景来查看。它不再符合其内容。

我设法通过在第0列和第2列中放置透明的Canvas元素并设置列maxwidth来破解解决方案,但我觉得必须有更好的方法。

1 个答案:

答案 0 :(得分:1)

实际上,网格已经填充了单元格。您可以为网格设置背景,如:

  <Grid MouseLeftButtonDown="Grid_MouseLeftButtonDown"  Background="Red"
      VerticalAlignment="Stretch"
      HorizontalAlignment="Stretch" >

然后尝试单击它,将触发MouseLeftButtonDown事件。

原因是,Grid的背景默认为null,这意味着UI上没有绘图区域,因此不会触发任何事件。您可以设置Background="Transparent"

Background="Transparent"Background= null不同,Background="Transparent"表示控件具有背景并且有绘图区域。

这是我的例子:

<Window.Resources>
    <Style TargetType="DataGridCell">
        <Setter Property="Height" Value="64"/>
        <Setter Property="HorizontalContentAlignment" Value="Stretch"/>
        <Setter Property="VerticalContentAlignment" Value="Stretch"/>
    </Style>
</Window.Resources>

  <DataGrid x:Name="dg">
    <DataGrid.Columns>
        <DataGridTemplateColumn>
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <Grid MouseLeftButtonDown="Grid_MouseLeftButtonDown" Background="Red"
      VerticalAlignment="Stretch"
      HorizontalAlignment="Stretch">
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition Width="*"/>
                        </Grid.ColumnDefinitions>
                        <Image     HorizontalAlignment="Center"
               VerticalAlignment="Center"
               Width="24" Height="24"
               Source="add.png"/>
                    </Grid>
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
        </DataGridTemplateColumn>
    </DataGrid.Columns>
</DataGrid>


public MainWindow()
{
    InitializeComponent();
    List<string> lst = new List<string>() { "123" };
    dg.ItemsSource = lst;
}

private void Grid_MouseLeftButtonDown(object sender,      MouseButtonEventArgs e)
{
    MessageBox.Show("hit");
}