我正在尝试识别DataGrid中每个单元格上的MouseLeftButtonDown,但有两件事阻止了我:
这是我的手机模板:
<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来破解解决方案,但我觉得必须有更好的方法。
答案 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");
}