C# 关闭可见性的WPF代码:打开多个StackPanel
我有多个stackpanel,它们一开始是折叠的,当单击一个按钮时,与按钮单击相关的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
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,我正在更新相同的代码。