Как получить строку и столбец нажатия кнопки в обработчике событий сетки? - PullRequest
1 голос
/ 29 апреля 2010

После того, как нажата добавленная кнопка в сетке (элемент управления окна Grid, а не Gridview или datagrid), как найти, в какой строке и столбце кнопка находится в обработчике события сетки, например, событие щелчка или некоторые другие события? Не обработчик событий нажатия кнопки

        #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

Спасибо

Я заметил, что у Бояна есть какое-то решение для случая обработчика события нажатия кнопки

Как в WPF определить, в каком столбце / строке в сетке находится элемент управления?

В обработчике события 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... 
}

Ответы [ 2 ]

2 голосов
/ 29 апреля 2010

См. InputHitTest () :

UIelement element = (UIelement) Grid.InputHitTest(e.GetPosition(Grid));
row= Grid.GetRow(element); 
0 голосов
/ 29 апреля 2010

Как и почти все остальное в 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 вы в конечном итоге напишите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...