2010-04-29 6 views
1

그리드에 추가 된 버튼 (그리드 뷰 또는 데이터 그리드가 아닌 윈도우 컨트롤 그리드)을 클릭하면 그리드 이벤트 핸들러에서 버튼이 위치한 행과 열을 클릭 이벤트 또는 다른 이벤트와 같이 찾는 방법은 무엇입니까? 아니 버튼 클릭 이벤트 핸들러그리드 이벤트 핸들러에서 클릭 한 행과 열을 가져 오는 방법은 무엇입니까?

 #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 

감사

나는 Boyan 버튼 당신을위한 Click 이벤트 처리기에서 버튼 클릭 이벤트 처리기의 경우

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

에 대한 몇 가지 솔루션을 통지 말 :

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
+0

어쨌든 행 또는 열 번호를 반환하지 않습니다. – Archie

+0

쿨! 고마워요! – user302933

+1

UIelement 요소 = (UIelement) Grid.InputHitTest (e.GetPosition (Grid)); row = Grid.GetRow (element); – user302933

0

WPF의 다른 모든 것과 마찬가지로 데이터 바인딩을 사용하는 것이 좋습니다.

단추에 대한 클래스를 빌드하고 XmlDataProvider을 사용하는 대신 ItemsSource을 해당 모음에 바인딩 할 수 있습니다. (나는 Kaxaml에서 위를 쓴 이후, 검증되지 않은)

<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 [email protected]}" 
        Grid.Column="{Binding [email protected]}" 
        Content="{Binding [email protected]}" 
        Click="Button_Click"/> 
     </Grid> 
     </DataTemplate> 
     </ItemsControl.ItemTemplate> 
    </ItemsControl> 
    </DockPanel> 
</Page> 

이 이벤트 핸들러는 다음과 같아야합니다 :

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 
} 
그것이 쉽게 복사 할 수 있습니다 예를 붙여있게 때문에 XML을 사용하고 있습니다

버튼의 DataContext에는 Click 이벤트에 사용할 모든 정보 (행 및 열, 물론 버튼과 연결해야하는 다른 속성)가 포함되어 있습니다. 이와 같은 접근 방식으로 작업할수록 WPF 관련 코드와 마크 업이 줄어들어 글을 쓸 수 있습니다.

관련 문제