从代码中创建的单击控件获取网格位置

时间:2014-08-04 19:06:46

标签: c# wpf

我试图从生成的控件中获取行和列的位置,并将其放置在ControlTemplate的代码中。

ControlTemplate看起来像这样:

<Window.Resources>
        <ControlTemplate x:Key="myButtonTemplate" TargetType="Button">
            <Canvas x:Name="myButton" Background="#FFCFCECE" AllowDrop="True"
                    Drop="myButton_Drop" Opacity="1" MouseDown="myButton_MouseDown" >
                <Button x:Name="childButton" 
                        Height="30" Width="30" 
                        Canvas.Top="10" Canvas.Right="10" BorderThickness="0" >
                    <Button.Background>
                        <ImageBrush ImageSource="Resources/pic.png"/>
                    </Button.Background>
                </Button>
                <Label x:Name="nameLabel" Content="&lt;empty&gt;" 
                       Canvas.Bottom="35" Canvas.Left="10" FontSize="18" FontWeight="Bold" />
            </Canvas>
        </ControlTemplate>
</Window.Resources>

正如您所看到的,它有一种接受鼠标点击的方法:myButton_MouseDown

控件在启动时放在网格中,如下所示:

// Add a button for every grid
for (int r = 0; r < myGrid.RowDefinitions.Count; r++)
{
    for (int c = 0; c < myGrid.ColumnDefinitions.Count; c++)
    {
        Button someButton = new Button();
        someButton.Template = (ControlTemplate)FindResource("myButtonTemplate");
        someButton.Name = "sb_" + r + "_" + c;
        someButton.SetValue(Grid.RowProperty, r);
        someButton.SetValue(Grid.ColumnProperty, c);
        myGrid.Children.Add(someButton);
     }
}

我正试图找到点击网格的位置,但我无法弄明白。这是我最接近的,但是row和col总是0。

private void soundButton_MouseDown(object sender, MouseButtonEventArgs e)
{
    Canvas canvas = (Canvas)sender;
    int col = Grid.GetColumn((UIElement)canvas);
    int row = Grid.GetRow((UIElement)canvas);
}

关于我做错了什么的任何建议?

1 个答案:

答案 0 :(得分:1)

试试这个

private void myButton_MouseDown(object sender, MouseButtonEventArgs e)
    {
        Canvas canvas = (Canvas)sender;
        int col = Grid.GetColumn((UIElement)canvas.TemplatedParent);
        int row = Grid.GetRow((UIElement)canvas.TemplatedParent);
    }