WPF代码关闭:打开多个堆栈面板的可见性
本文关键字:堆栈 可见性 代码 WPF | 更新日期: 2023-09-27 18:10:19
我有多个堆叠面板,首先被折叠,作为一个按钮被点击,与按钮点击相关的堆叠面板变得可见。到目前为止,这是我的工作
private void Button1_Click(object sender, RoutedEventArgs e)
{
dgrid.ItemsSource = FillDataGrid("ShipWorksConnection", "GetPicklistItems", "PickList");
SP1.Visibility = Visibility.Visible;
SP2.Visibility = Visibility.Collapsed;
SP3.Visibility = Visibility.Collapsed;
SP4.Visibility = Visibility.Collapsed;
}
private void Button2_Click(object sender, RoutedEventArgs e)
{
dgrid.ItemsSource = FillDataGrid("SupplyConnection", "GetAllSupplies", "Supplies");
SP1.Visibility = Visibility.Collapsed;
SP2.Visibility = Visibility.Visible;
SP3.Visibility = Visibility.Collapsed;
SP4.Visibility = Visibility.Collapsed;
}
等用于多个按钮单击事件。这是处理这个的方式,因为我将添加更多的按钮点击事件是有别的东西我可以做,使代码更可重用。
如果在隐藏/显示元素中有一些组合逻辑,您可以使用绑定来切换可见性。
对于这个示例,您必须创建一个视图模型并在其中创建一个属性TheConditionProperty
。然后将视图模型绑定到控件。在您的场景中,您甚至可以绑定到一个项目数组,这比反复添加属性要容易得多。
<StackPanel>
<StackPanel.Style>
<Style TargetType="StackPanel">
<Style.Triggers>
<DataTrigger Binding="{Binding TheConditionProperty}" Value="False">
<Setter Property="Visibility" Value="Collapsed" />
</DataTrigger>
</Style.Triggers>
</Style>
</StackPanel.Style>
</StackPanel>
WPF开发人员一般不会像现在这样在过程代码中设置控件的Visibility
属性。相反,更常见的是为要显示或隐藏的每个控件声明bool
属性,并使用BooleanToVisibilityConverter
将bool
值转换为Visibility
值:
<SomeControl Visibility={Binding IsSomeControlVisible,
Converter={StaticResource BooleanToVisibilityConverter}} ... />
然后要显示这个控件,您只需将IsSomeControlVisible
属性设置为true
,并将其设置为false
。
add Simple button click(Button_Click) to all the button (e.g button1 , button2)... In below code assume that u had button name property as button1 and button2.
private void Button_Click(object sender, RoutedEventArgs e)
{
Button b = sender as Button;
List<StackPanel> CollapsedStackPanel = new List<StackPanel>();
if (b.Name == Button1.Name)
{
dgrid.ItemsSource = FillDataGrid("ShipWorksConnection", "GetPicklistItems", "PickList");
CollapsedStackPanel.Add(SP2); //add only stackpanel that u want set Collapsed
CollapsedStackPanel.Add(SP3); //add only stackpanel that u want set Collapsed
CollapsedStackPanel.Add(SP); //add only stackpanel that u want set Collapsed
}
else if (b.Name == Button2.Name)
{
dgrid.ItemsSource = FillDataGrid("ShipWorksConnection", "GetPicklistItems", "PickList");
CollapsedStackPanel.Add(SP1);
CollapsedStackPanel.Add(SP3); //add only stackpanel that u want set Collapsed
CollapsedStackPanel.Add(SP4); //add only stackpanel that u want set Collapsed
}
//can add here more else if other buttons as well
SetStackPanelVisibility(CollapsedStackPanel);
}
private void SetStackPanelVisibility(List<StackPanel> CollapsedStackPanel)
{
//get all the stackpanel in current window
//if its in visible list then set its visiblity to visible
// else set its visibility to collapsed
foreach (StackPanel item in FindVisualChildren<StackPanel>(this))
{
if (CollapsedStackPanel.Contains(item))
{
item.Visibility = System.Windows.Visibility.Collpsed;
}
}
}
public static IEnumerable<T> FindVisualChildren<T>(DependencyObject depObj) where T : DependencyObject
{
//preferably put this code in some common place so u can use whenever u want.
if (depObj != null)
{
for (int i = 0; i < VisualTreeHelper.GetChildrenCount(depObj); i++)
{
DependencyObject child = VisualTreeHelper.GetChild(depObj, i);
if (child != null && child is T)
{
yield return (T)child;
}
foreach (T childOfChild in FindVisualChildren<T>(child))
{
yield return childOfChild;
}
}
}
}
好吧,如果没有组合逻辑,那么你至少可以"快捷"它,只是一个想法,你可以绕过强类型。
ViewHelper.SetBulkVisibility(Visibility.Collapsed, new List<dynamic> {SP1, SP2, SP3});
public static class ViewHelper
{
public static void SetBulkVisibility(Visibility value, IEnumerable<dynamic> objects)
{
foreach (var o in objects)
{
o.Visibility = value;
}
}
}
或
可能是类似的方法,在列表中对象的当前可见性。