【问题标题】:How to get the row and column of button clicked, in the grid event handler?如何在网格事件处理程序中获取单击按钮的行和列?
【发布时间】:2010-04-29 03:39:34
【问题描述】:

一旦在网格中添加的按钮(窗口控件网格,而不是网格视图或数据网格)被单击,如何找到按钮位于网格事件处理程序中的哪一行和哪一列,例如单击事件或其他一些事件?不是按钮单击事件处理程序

        #region Grid event handler setup
        myGrid.MouseEnter += new MouseEventHandler(myGrid_MouseEnter);
        myGrid.MouseLeave += new MouseEventHandler(myGrid_MouseLeave);
        myGrid.MouseDown += new MouseButtonEventHandler(myGrid_MouseDown);
        myGrid.MouseUp += new MouseButtonEventHandler(myGrid_MouseUp);
        #endregion

谢谢

我注意到博言对按钮点击事件处理案例有一些解决方案

In WPF, how can I determine what column/row in a grid a control is in?

在您说的按钮的 Click 事件处理程序中:

int row; 
Button btn = sender as Button; 
if (btn != null) 
{ 
    row = Grid.GetRow(btn); // And you have the row number... 
} 
else 
{ 
    // A nasty error occurred... 
}

【问题讨论】:

    标签: c# wpf wpf-controls


    【解决方案1】:

    InputHitTest():

    UIelement element = (UIelement) Grid.InputHitTest(e.GetPosition(Grid));
    row= Grid.GetRow(element); 
    

    【讨论】:

    • 无论如何它都不会返回行号或列号。
    • UIelement element = (UIelement)Grid.InputHitTest(e.GetPosition(Grid)); row= Grid.GetRow(element);
    【解决方案2】:

    与 WPF 中的其他所有内容一样,使用数据绑定可能会更好。

    您可以为按钮构建一个类并将ItemsSource 绑定到它们的集合,而不是使用XmlDataProvider;我使用 XML 是因为它是一个可以轻松复制和粘贴的示例:

    <Page
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
      <Page.Resources>
        <XmlDataProvider x:Key="Data">
          <x:XData>
            <Data xmlns="">
              <Button Row="0" Column="0" Text="First"/>
              <Button Row="1" Column="3" Text="Second"/>
              <Button Row="4" Column="4" Text="Third"/>
            </Data>
          </x:XData>
        </XmlDataProvider>
      </Page.Resources>
      <DockPanel Height="300" Width="300">
        <ItemsControl ItemsSource="{Binding Source={StaticResource Data}, XPath=/Data/Button}">
           <ItemsControl.ItemTemplate>
            <DataTemplate>
             <Grid>
              <Grid.RowDefinitions>
                <RowDefinition/>
                <RowDefinition/>
                <RowDefinition/>
                <RowDefinition/>
                <RowDefinition/>
              </Grid.RowDefinitions>
              <Grid.ColumnDefinitions>
                <ColumnDefinition/>
                <ColumnDefinition/>
                <ColumnDefinition/>
                <ColumnDefinition/>
                <ColumnDefinition/>            
              </Grid.ColumnDefinitions>
               <Button Grid.Row="{Binding XPath=@Row}" 
                       Grid.Column="{Binding XPath=@Column}" 
                       Content="{Binding XPath=@Text}"
                       Click="Button_Click"/>
             </Grid>
            </DataTemplate>
           </ItemsControl.ItemTemplate>
        </ItemsControl>
      </DockPanel>
    </Page>
    

    事件处理程序应该如下所示(未经测试,因为我在 Kaxaml 中编写了上述内容):

    private void Button_Click(object sender, EventArgs e)
    {
       Button b = (Button) sender;
       XmlElement elm = (XmlElement)b.DataContext;
       int row = Convert.ToInt32(elm.GetAttribute("Row"));
       int column = Convert.ToInt32(elm.GetAttribute("Column"));
       // now do whatever you need to do with the row and column
    }
    

    这里的关键是按钮的DataContext 包含您将用于Click 事件的所有信息 - 行和列,当然,还有您需要与按钮关联的任何其他属性。使用这种方法的次数越多,最终编写的特定于 WPF 的代码和标记就越少。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-07-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-16
      相关资源
      最近更新 更多