2013-10-22 81 views
0

我在每個按鈕下面動態地創建帶有擴展器的按鈕。點擊每個按鈕時,我希望打開此按鈕下方的擴展器。我怎樣才能知道在每個按鈕上點擊哪個擴展器打開?WPF動態創建按鈕和擴展器控件

public partial class MainWindow : Window 
{ 

    List<List<string>> Buttons; 


    public MainWindow() 
    { 
     InitializeComponent(); 

     Buttons = new List<List<string>>(); 

     ///////////////////////////////////////// 
     List<string> lst1 = new List<string>(); 
     lst1.Add("main1"); 
     lst1.Add("a1"); 
     lst1.Add("a2"); 
     lst1.Add("a3"); 
     lst1.Add("a4"); 
     Buttons.Add(lst1); 
     ///////////////////////////////////////// 
     List<string> lst2 = new List<string>(); 
     lst2.Add("main2"); 
     lst2.Add("b1"); 
     lst2.Add("b2"); 
     lst2.Add("b3"); 
     lst2.Add("b4"); 
     Buttons.Add(lst2); 
     ///////////////////////////////////////// 
     List<string> lst3 = new List<string>(); 
     lst3.Add("main3"); 
     lst3.Add("c1"); 
     lst3.Add("c2"); 
     lst3.Add("c3"); 
     lst3.Add("c4"); 
     Buttons.Add(lst3); 

     for (int i = 0; i < Buttons.Count; i++) 
     { 
      Button newBtn = new Button(); 
      newBtn.Content = Buttons[i][0]; 
      newBtn.Name = "Button" + i.ToString(); 

      newBtn.Height = 23; 
      stackPanel1.Children.Add(newBtn); 
      newBtn.Click += new RoutedEventHandler(newBtn_Click); 


      Expander expader = new Expander(); 
      StackPanel newStck = new StackPanel(); 

      for (int j = 1; j < Buttons[i].Count; j++) 
      { 
       Button newBtnIn = new Button(); 
       newBtnIn.Content = Buttons[i][j]; 
       newBtnIn.Name = "Button" + j.ToString(); 
       newBtnIn.Height = 23; 
       newBtnIn.Width = 100; 

       newStck.Children.Add(newBtnIn); 
      } 

      expader.Content = newStck; 
      stackPanel1.Children.Add(expader); 
     } 


    } 

    private void newBtn_Click(object sender, RoutedEventArgs e) 
    { 
     //open specific expander below button 
    } 
} 

回答

1

你可以給按鈕一個引用它的擴展器,使用按鈕的Tag屬性。 一個工作的解決辦法是:

public partial class MainWindow : Window 
{ 

    List<List<string>> Buttons; 


    public MainWindow() 
    { 
     InitializeComponent(); 

     Buttons = new List<List<string>>(); 

     ///////////////////////////////////////// 
     List<string> lst1 = new List<string>(); 
     lst1.Add("main1"); 
     lst1.Add("a1"); 
     lst1.Add("a2"); 
     lst1.Add("a3"); 
     lst1.Add("a4"); 
     Buttons.Add(lst1); 
     ///////////////////////////////////////// 
     List<string> lst2 = new List<string>(); 
     lst2.Add("main2"); 
     lst2.Add("b1"); 
     lst2.Add("b2"); 
     lst2.Add("b3"); 
     lst2.Add("b4"); 
     Buttons.Add(lst2); 
     ///////////////////////////////////////// 
     List<string> lst3 = new List<string>(); 
     lst3.Add("main3"); 
     lst3.Add("c1"); 
     lst3.Add("c2"); 
     lst3.Add("c3"); 
     lst3.Add("c4"); 
     Buttons.Add(lst3); 

     for (int i = 0; i < Buttons.Count; i++) 
     { 
      Button newBtn = new Button(); 
      newBtn.Content = Buttons[i][0]; 
      newBtn.Name = "Button" + i.ToString(); 

      newBtn.Height = 23; 
      stackPanel1.Children.Add(newBtn); 
      newBtn.Click += new RoutedEventHandler(newBtn_Click); 


      Expander expader = new Expander(); 
      StackPanel newStck = new StackPanel(); 

      for (int j = 1; j < Buttons[i].Count; j++) 
      { 
       Button newBtnIn = new Button(); 
       newBtnIn.Content = Buttons[i][j]; 
       newBtnIn.Name = "Button" + j.ToString(); 
       newBtnIn.Height = 23; 
       newBtnIn.Width = 100; 
       newBtn.Tag = expader; 
       newBtn.Click+=newBtn_Click; 
       newStck.Children.Add(newBtnIn); 
      } 

      expader.Content = newStck; 
      stackPanel1.Children.Add(expader); 
     } 


    } 

    private void newBtn_Click(object sender, RoutedEventArgs e) 
    { 
     Button b = sender as Button; 

     if (b == null) 
      return; 

     Expander ex = b.Tag as Expander; 

     if (ex == null) 
      return; 

     ex.IsExpanded = !ex.IsExpanded; 
    } 
} 
1

我想你應該使用ToggleButton代替Button這可以讓你處理IsChecked狀態和結果展開/摺疊底層Expander控制。
正如你就可以用內ToggleButtonExpander定義DataTemplate結果:

<DataTemplate> 
    <StackPanel> 
    <ToggleButton x:Name="expandButton" IsChecked="false"/> 
    <Expander IsExpanded="{Binding IsChecked, ElementName=expandButton}"> 
     <TextBlock TextWrapping="Wrap"> 
      Lorem ipsum dolor sit amet, consectetur 
      adipisicing elit, sed do eiusmod tempor incididunt ut 
      labore et dolore magna aliqua 
     </TextBlock> 
    </Expander> 
    </StackPanel> 
</DataTemplate> 

之後,你應該考慮使用任何ListViewListBoxItemsSource設定任何其它合適的控制是你的按鈕列表。這會給你乾淨的設計,沒有太多的代碼隱藏,這不如練習顯示。