2013-01-03 2 views
0

가능한 중복 : 나는 MenuItem.Click에서 제기 이벤트를 처리하기 위해 노력하고있어
Passing arguments to event handler전달 사용자 정의 인수

. 캐치 (catch)는 일부 사용자 지정 인수를 전달하는 방법이 필요합니다 (특히 행과 열을 나타내는 두 개의 정수).

private void Window_Loaded(object sender, RoutedEventArgs e) 
{ 
    ... 
    MenuItem froNewChild = new MenuItem(); 
    froNewChild.Header = "Insert new box"; 
    froNewChild.Click += new RoutedEventHandler(froNewChild_Click); 
    // froNewChild.Click += new RoutedEventHandler(froNewChild_Click, column, row); 
    FlowRectangleOptions.Items.Add(froNewChild); 
    ... 
} 

private void froNewChild_Click(object sender, RoutedEventArgs e) //+column & row 
{ 
    FlowDocument.allColumns[column-1].AddFlowRectangle(column, row); 
    FlowDocument.ReRenderAll(canvas1); 
} 

이 답변 Passing arguments to an event handler 내가 원하는 것을 할 것 같다,하지만 sender 이미이 범위에 정의되어 있기 때문에 그대로 작동하지 않습니다. 슬프게도 나는 아직 그 문제를 해결할만큼 충분한 것을 모르고있다.

+0

아, 항상 방법 시간 동안 무언가를 시도하고 다음 질문을 게시 한 후 사분를 알아낼. 이것을 무시하십시오! 그러나 관심을 가져 주셔서이 글을 읽는다면 고마워요. –

+0

은'row' 값이'column' 값이었을까요? 어딘가에'DataGrid'가 있습니까? –

+0

이 글을 읽는 누군가를 추후에 참조 할 수있는 해결책은 http://stackoverflow.com/questions/12293471/passing-arguments-to-event-handler에 설명 된 바와 같았지만 마침내 "발신자"라는 이름을 붙일 수 있었다. 그밖에! –

답변

3

Assumming "열"과 "행의"로드 방법에 생성됩니다, 당신은 단지 람다 이벤트 핸들러를 사용할 수 있습니다.

void MainWindow_Loaded(object sender, RoutedEventArgs e) 
    { 
     //Assumming "column" and "row" are in this block somewhere. 
     ... 
     MenuItem froNewChild = new MenuItem(); 
     froNewChild.Header = "Insert new box"; 
     froNewChild.Click += (s, eArgs) => 
     { 
      FlowDocument.allColumns[column - 1].AddFlowRectangle(column, row); 
      FlowDocument.ReRenderAll(canvas1); 
     }; 
     FlowRectangleOptions.Items.Add(froNewChild); 
     ... 
    } 
+0

고마워요, 그 일을합니다. 내 생각 엔 디자인에 행과 열의 약간의 결함이 있음을 암시한다고 생각하지만, 지금 실수로 배우는 것이 좋습니다.) –

+0

코드가 결함이없는 경우 작동합니다. :) –

0

evant 처리기에 전달 된 인수는 발생하는 클래스의 디자인 방식에 따라 달라지며 두 번째 인수로 EventArgs에서 파생 된 클래스로 전달됩니다. 이벤트를 제기하는 클래스의 디자이너가 아니라면이 기능을 확장 할 수 없습니다. 이 특별한 경우 우리는 프레임 워크 클래스에 대해 이야기하고 있으므로 전혀 불가능합니다.

해결 방법으로 클래스의 일부 상태 멤버 변수를 정의하고이를 사용하여 정보를 처리기에 전달할 수 있습니다. 당신이 변수를 전달할 수 있도록

0

sa_ddam213 이미 대답하지만 단지 명확하게 : 람다 식의 매개 변수 이름은 의미 론적 의미를 가지지 않으며 원하는대로 지정할 수 있습니다. sender 및 eventArgs 이름은 연결된 질문의 명확성을 위해서만 사용되었습니다. 이 경우 중요한 것은 두 개의 매개 변수가 있고 컴파일러가 나머지를 스스로 유추한다는 것입니다.

람다를 정의한 시점에서 열과 행의 값이 캡처되며 MainWindow_Loaded가 오래 전에 반환되고 원래 변수가 삭제 되더라도 이벤트 핸들러가 실행될 때 사용할 수 있습니다. C#에서 람다 표현식에 대한 자세한 내용은

: http://msdn.microsoft.com/en-us/library/bb397687.aspx