Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/299.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/joomla/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 关闭可见性的WPF代码:打开多个StackPanel_C#_Wpf - Fatal编程技术网

C# 关闭可见性的WPF代码:打开多个StackPanel

C# 关闭可见性的WPF代码:打开多个StackPanel,c#,wpf,C#,Wpf,我有多个stackpanel,它们一开始是折叠的,当单击一个按钮时,与按钮单击相关的stackpanel将变为可见。现在,这就是我的工作原理 private void Button1_Click(object sender, RoutedEventArgs e) { dgrid.ItemsSource = FillDataGrid("ShipWorksConnection", "GetPicklistItems", "PickList"); SP1.V

我有多个stackpanel,它们一开始是折叠的,当单击一个按钮时,与按钮单击相关的stackpanel将变为可见。现在,这就是我的工作原理

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;

    }

等等,用于多个按钮单击事件。这就是处理这个问题的方法吗?既然我将添加更多的按钮点击事件,那么我还可以做些什么来提高代码的可重用性呢

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

对于此示例,您必须创建一个视图模型,并在其中创建属性
ConditionProperty
。然后将视图模型绑定到控件。在您的场景中,您甚至可以绑定到项目数组,这比反复添加属性更容易

<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开发人员通常不会像我们这样在过程代码中设置控件的
可见性
属性。相反,更常见的做法是为要显示或隐藏的每个控件声明
bool
属性,并使用将
bool
值转换为
可见性
值:

<SomeControl Visibility={Binding IsSomeControlVisible, 
    Converter={StaticResource BooleanToVisibilityConverter}} ... />

然后,要显示此控件,只需将
IsSomeControlVisible
属性设置为
true
,并将其设置为
false

将简单按钮单击(按钮单击)添加到所有按钮(例如按钮1、按钮2)。。。在下面的代码中,假设u的ButtonName属性为button1和button2。
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;
                        }
                    }
                }
            }
私有无效按钮\u单击(对象发送者,路由目标e) { 按钮b=发送器为按钮; List CollapsedStackPanel=新列表(); 如果(b.Name==Button1.Name) { dgrid.ItemsSource=FillDataGrid(“ShipWorksConnection”、“GetPicklistItems”、“PickList”); CollapsedStackPanel.Add(SP2);//只添加要折叠的stackpanel CollapsedStackPanel.Add(SP3);//只添加要折叠的stackpanel CollapsedStackPanel.Add(SP);//只添加要折叠的stackpanel } else if(b.Name==Button2.Name) { dgrid.ItemsSource=FillDataGrid(“ShipWorksConnection”、“GetPicklistItems”、“PickList”); CollapsedStackPanel.Add(SP1); CollapsedStackPanel.Add(SP3);//只添加要折叠的stackpanel CollapsedStackPanel.Add(SP4);//只添加要折叠的stackpanel } //如果还有其他按钮,可以在此处添加更多 SetStackPanel可见性(折叠StackPanel); } 私有void SetStackPanel可见性(列表CollapsedStackPanel) { //获取当前窗口中的所有stackpanel //如果其在可见列表中,则将其可见性设置为可见 //否则将其可见性设置为“折叠” foreach(FindVisualChildren中的StackPanel项(本)) { if(折叠的StackPanel.Contains(项目)) { item.Visibility=System.Windows.Visibility.Collpsed; } } } 公共静态IEnumerable FindVisualChildren(DependencyObject depObj),其中T:DependencyObject { //最好把这段代码放在一个普通的地方,这样你就可以随时使用。 if(depObj!=null) { for(int i=0;i
好吧,如果没有组合逻辑,那么你至少可以“捷径”它,这只是一个想法,你可以绕过强类型

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;
            }
        }
    }
ViewHelper.SetBulkVisibility(Visibility.collapped,新列表{SP1,SP2,SP3});
公共静态类ViewHelper
{
公共静态void SetBulkVisibility(可见性值,IEnumerable对象)
{
foreach(对象中的var o)
{
o、 能见度=价值;
}
}
}


可能类似的方法可以反转列表中对象的当前可见性。

您希望何时重用此代码?每个堆栈面板都会折叠,并具有一组与触发的按钮单击事件相关联的按钮控件。如果所有带有按钮的堆栈面板都显示出来,那么看起来会很混乱。我问这个问题的唯一原因是,我将添加更多带有更多按钮控件的堆栈面板,而不是在触发按钮事件时折叠所有堆栈面板,除了我需要的一个面板。这会起作用,但它会隐藏所有堆栈面板,而不仅仅是我想要折叠的面板。这不会起作用,因为你可以用其他方式处理它通过使用HidingStackPanel数组,您可以添加您实际想要隐藏的stackpanel,我正在更新相同的代码。