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;
    }

等用于多个按钮单击事件。这是处理这个的方式,因为我将添加更多的按钮点击事件是有别的东西我可以做,使代码更可重用。

WPF代码关闭:打开多个堆栈面板的可见性

如果在隐藏/显示元素中有一些组合逻辑,您可以使用绑定来切换可见性。

对于这个示例,您必须创建一个视图模型并在其中创建一个属性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属性,并使用BooleanToVisibilityConverterbool值转换为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;
            }
        }
    }

可能是类似的方法,在列表中对象的当前可见性。