2013-12-23 55 views
1

3个问题在我的WPF(窗口电话)简单的项目的标签来调用方法。我已经解决它花了很多时间,但没有具体的结果发现..WPF:如何通过设置动态创建的按钮

在我的CS文件我已经创建了一堆动态按钮。我与装箱for循环,并为每个动态按钮设置标签。

我的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个按钮creted。 问题是我想用按钮执行不同的操作...我已经设置标签,但我不知道如何访问按钮标签的操作..?

我的意思是我想是这样的......!

 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 buttonaccess 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

亲爱的,这不显示任何错误...但编译项目后...当我prees动态按钮..这就给错误...有这样的事情......并停止工作..类型'系统的例外。 InvalidCastException'发生在AimPass.DLL中,但未在用户代码中处理 – Arsal

0

在你的循环,你可以处理程序的按钮关联。

如:

   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我再一种方法可以让标签在事件这样

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 
} 

希望这有助于去。