2013-12-23 3 views
1

내 WPF (창 전화) 간단한 프로젝트에서 3 가지 문제. 나는 그것을 해결함으로써 많은 시간을 보냈지 만 어떤 특별한 결과도 발견되지 않았다.WPF : 동적으로 생성 된 버튼의 태그를 설정하여 메서드를 호출하는 방법

내 CS 파일에서 나는 동적 버튼들을 만들었다. for for loop와 set 동적 버튼을위한 태그를 만들었다.

내 cs 파일 코드가 여기에 있습니다.

private void Grid_View_Btn_1_Click(object sender, System.Windows.RoutedEventArgs e) 
    { 



     //Grid ButtonsAddition 
     Dispatcher.BeginInvoke(() => 
     { 
      string[] Trade = new string[] { "Portfolio Display", "Trade Idea Entry", "Trade Idea Monitor", "Historical Performance", "Intraday Performance", "Stock Performance" }; 

      StackPanel panel = new StackPanel(); 
      panel.Orientation = System.Windows.Controls.Orientation.Vertical; 

      //panel.HorizontalAlignment = System.Windows.HorizontalAlignment.Stretch; 
      //panel.VerticalAlignment = System.Windows.VerticalAlignment.Top; 

      int i; 
      for (i = 0; i < Trade.Length; i++) 
      { 
       Button btn = new Button() { Content = Trade[i] }; 
       btn.Margin = new Thickness(0, -10, 0, -10); 



       var brush = new ImageBrush(); 
       brush.ImageSource = new BitmapImage(new Uri("C:/Users/HafizArslan/Documents/Visual Studio 2012/Projects/AimPass/AimPass/Images/tabbar_btn_blue.png", UriKind.Relative)); 
       btn.Background = brush; 


       btn.Width = 190; 
       btn.Height = 75; 
       btn.FontSize = 14; 
       btn.FontWeight = light; 
       btn.FontStretch = Fill; 
       btn.HorizontalAlignment = HorizontalAlignment.Center; 
       btn.VerticalAlignment = System.Windows.VerticalAlignment.Stretch; 
       // btn.CornerRadius = new CornerRadius(15); 
       btn.BorderThickness = new Thickness(1, 1, 1, 1); 
       btn.Tag = i.ToString(); 
       btn.Click += new RoutedEventHandler(abc_click); 


       panel.Children.Add(btn); 

      } 
      grid.Children.Add(panel); 

     }); 
    } 
    private void abc_click(object sender, EventArgs e) 
    { 


    } 

6 개의 버튼이 있습니다. 문제는 단추로 다른 작업을 수행하고 싶습니다 ... 태그를 설정했지만 어떻게 단추 태그로 작업에 액세스 할 수 있습니까?

나는 이런 것을 원한다는 것을 의미한다 ... !!

친절하게 말해 ...

 private void abc_click(object sender, EventArgs e) 
    { 

    // If(btn.Tag==1) 
    { 
    //Some Code Here 
    } 
    else 
    if(btn.Tag==2) { 
        //Perform other Function 
        } 
    } Etc.....? 

및 기타 문제는 모든 생성 버튼 배경 ... 이미지의 이미지 brush..Assign 정확한 경로를 만든 것입니다 .... 그러나 이미지가 연결되어 있지 않습니다 이 두 가지 문제에 관한 내용 ...

+1

인프라를 변경하고 데이터 바인딩/ItemsControl을 처리하는 것이 좋습니다. –

+0

@ Felice Pollano 나는 많은 일을 해왔다 ... 나는 그게 가능하지 않을 것 같아 .... 친절하게도 이것에 대한 해결책이 있는지 아니면 어떤 방법으로 ..? – Arsal

+2

내가 당신에게 준 제안은 내가하는 일입니다. –

답변

0

당신은 핸들러에서 보낸 사람이, 당신이 type cast sender to button을 할 수 및 access Tag property부터 :

private void abc_click(object sender, EventArgs e) 
{ 
    Button button = (Button)sender; 
    if(Convert.ToInt32(button.Tag) == 1) 
    { 
     ..... 
    } 
} 
+0

operater "=="이 (가) int 형 객체의 피연산자에 적용될 수 없습니다 ...이 오류가 발생하고 있습니까? – Arsal

+0

'button.Tag'는 type 객체입니다. 먼저 int로 변환해야합니다. 업데이트 된 답변을 확인하십시오. –

+0

친애하는이 어떤 오류를 보여주지 않습니다 ...하지만 프로젝트를 컴파일 한 후 ... 내가 동적 버튼을 prees ... 이것은 오류를 준다 ... 이런 식으로 ... 그리고 작동을 중지 .. '시스템의 예외. InvalidPast.DLL에서 발생했지만 InvalidCastException '이 사용자 코드에서 처리되지 않았습니다. – Arsal

0

for 루프에서 처리기를 단추에 연결할 수 있습니다.

같은 :

   Button btn = new Button() { Content = Trade[i] }; 
       btn.Margin = new Thickness(0, -10, 0, -10); 
       if(<something>) 
        btn.Click += YourEventHandler1; 

       if(<something2>) 
        btn.Click += YourEventHandler2; 

당신이 태그의 속성에 액세스하려면, 당신은 너무로, 버튼에 보낸 사람을 캐스팅해야합니다

private void abc_click(object sender, EventArgs e) 
    { 
     var btn = (Button)sender; 
    } 
+0

나는 각 버튼에 대해 나는 이벤트를 만들어야한다고 생각한다. ... ??? 친애하는 프로젝트의 루프와 같은 유형이 많습니다.이 작업을 수행하기가 너무 어렵습니다 ... ?? – Arsal

0

모든 생성 된 버튼에 대해 이벤트가 sa 인 경우 내게는 한 가지 방법은 이제 스위치이 도움이

switch(tag) 
{ 
case 1: 
//Action 
break; 
case 2: 
//Acrion 
break; 
//more cases 
} 

희망을 사용하여이

int tag=Convert.ToInt32((sender as Button).Tag); 

같은 경우에 태그를 얻을 수 있습니다.

+0

스위치도 오류를 표시하고 있습니다 ... int tag = Convert.ToInt32 ((Button as sender .Tag); 나는 이것을 넣어야 만한다. .. ?? 내 루프 또는 내 이벤트 처리기에서 ..? – Arsal

+0

이것을 이벤트 핸들러에 추가하면 태그를 문자열로 유지하고 문자열 값의 경우를 만들 수 있습니다. 아무 것도 도움이되지 않습니다 –

+0

이름 전환이 현재 컨텍스트에 존재하지 않고 ... 표시 중입니다. 예상 ... – Arsal

0

이 도움이

var tag=((sender as Button).Tag).ToString(); 
////now use a switch 

Switch(tag) 
{ 
case "1": 
//Action 
break; 
case "2": 
//Acrion 
break; 
//more cases 
} 

희망으로 가야한다.

관련 문제