2013-12-23 1 views
1

3 проблемы в моем WPF (оконном телефоне) простой проект. Я потратил много времени, решая его, но никакого конкретного результата не найдено.WPF: как вызвать метод, установив тег динамически созданных кнопок

В моем файле cs я создал кучу динамических кнопок ... Я создал с циклом for и установил теги для каждой динамической кнопки.

My 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 кнопок. проблема в том, что я хочу выполнять разные действия с помощью кнопки ... Я установил теги, но я не знаю, как я могу получить доступ к действиям с помощью кнопок Tag ..?

Я имею в виду, я хочу что-то вроде этого ... !!

 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 точный путь изображения ... для каждого созданного фона кнопки .... Но изображение не прилагается ...

Пожалуйста, скажите мне об этих 2 проблемах ...

+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

Оператор «==» не может применяться к операндам объекта типа int ... Эта ошибка наступает ..? – Arsal

+0

'button.Tag' имеет тип объекта. Вам нужно сначала перенести его в int. Проверьте обновленный ответ. –

+0

Дорогой это не показывает никакой ошибки ... но после компиляции проекта ... когда я читаю динамическую кнопку..это дает ошибку ... что-то вроде этого ... и перестает работать. Исключение типа «Система. InvalidCastException 'произошел в AimPass.DLL, но не был обработан в коде пользователя – 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

, если для всех созданных кнопок событие са мне тогда один подход мог бы получить метку в случае как этот

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

Теперь использовать переключатель

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

надеюсь, что это помогает.

+0

переключатель также показывает ошибку ... int tag = Convert.ToInt32 ((отправитель как кнопка) .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 
} 

надеюсь, что это помогает.

Смежные вопросы