如何Hittest Grid ColumnDefinition?

时间:2011-11-29 09:15:26

标签: wpf events hittest

我正在制作WPF Designer。我想找出ColumnDefinition我点击了从网格控件中删除它。我会照顾那些“在ColumnDefinition中”的孩子。 我可以从点击事件处理程序的sender参数中获取它吗? 现在我正在检查e.GetPosition是否在ColumnDefinition.ActualWidth的范围内,但我想知道是否有更美丽的解决方案。

2 个答案:

答案 0 :(得分:1)

在点击事件处理程序中:

int columnIndex = Grid.GetColumn((UIElement)sender);

发件人,如果是直接网格的孩子。

答案 1 :(得分:0)

为什么你还需要捕获ColumnDefinition上的一个点击?是虚拟的,它没有任何实际的主体,它只是Grid的一个提示,你想如何布局它的内容。 因此,您必须在内容对象上设置处理程序,而不是在ColumnDefinition上设置处理程序。

如果您确实需要捕获网格单元格的整个表面上的单击,您可以尝试在其中放置一个白色(或其他颜色与背景相同)Reactangle并捕获它上面的单击。

有关WPF Grid如何工作的一些说明。 当你向网格添加一些控件时,它们都会变成它的子节点。

<Grid>
    <Button/>
    <TextBox/>
    <Label/>
</Grid>

并且它们都将显示不是关于如何配置Column或RowDefinitions。 Column和RowDefinitions只告诉Grid你想如何对其中的所有现有元素进行aling,但它们不是容器,它们不包含元素。

<Grid>
    <Grid.ColumnDefinitions> 
        <ColumnDefinition Width="10"/>
        <ColumnDefinition Width="*"/>
        <ColumnDefinition Width="Auto"/>
    </Grid.ColumnDefinitions> 
    <Button/><!-- this is identical to Grid.Column="0"-->
    <TextBox Grid.Column="1"/>
    <Label Grid.Column="2"/>
</Grid>

在这个例子中,我们创建了三个ColumnDefinitions,即使是你可以看到的网格XAML,控件也不在内部定义中。它们像标尺指南一样用于对齐内容。 然后在元素上设置附加属性,以告诉网格要放置元素的位置。 当网格开始布局时,它会看到有三个元素和三个ColumnDefinitions,并将尝试将元素定位为ColumnDefinitions所说的。 但是,如果在运行时删除或更改ColumnDefinitions,网格将以新的方式重新对齐控件。 如果要隐藏某些元素,则必须隐藏它们,而不是ColumnDefinition。