我正在创建动态按钮,每个按钮下方都有扩展器。单击每个按钮时,我希望此按钮下方的扩展器将打开。如何在每个按钮中找到要打开的扩展器?
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
}
}
答案 0 :(得分: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 :(得分:1)
我认为您应该使用ToggleButton
代替Button
,这样您就可以处理IsChecked
状态,从而扩展/折叠基础Expander
控件。
因此,您可以在DataTemplate
和ToggleButton
内定义Expander
:
<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>
之后,您应该考虑使用ListView
,ListBox
或任何其他合适的控件ItemsSource
设置为您的按钮列表。这将为您提供干净的设计,而不需要大量的代码隐藏,这不如练习演示那么好。