我正在研究WPF Xaml应用程序。该应用程序有各种堆栈面板(行为像图标),我需要根据特定标准更改可见性。
问题: 如何折叠所有子元素(stackpanels)? 我在vb.net的后端逐个崩溃。但更确切地说,找到一个很酷的方法来同时完成所有工作。
答案 0 :(得分:2)
在这种情况下,您可以有两个选项
使用Style:
使用用于显示图像的目标类型
编写如下样式 <Window.Resources>
<Style TargetType="TextBox">
<Setter Property="Visibility" Value="Collapsed"/>
</Style>
</Window.Resources>
<Grid>
<StackPanel>
<TextBox Height="26" Width="200" Name="text1"/>
<TextBox Height="26" Width="200" Name="text2"/>
<Button Height="26" Width="200" Click="Button_Click_2" />
</StackPanel>
</Grid>
默认情况下,TextBox会折叠,您可以根据后端代码中的搜索将其显示
自定义控制:
这只是一个包装器,用于控制您使用以显示图标,但只有一个更改是默认可见性将被折叠。然后,您可以将其显示为任何您想要的
覆盖隐藏已存在的可见性属性,其默认值为已折叠
答案 1 :(得分:1)
使用IValueConverter
等BooleanToVisibilityConverter
实施方式绑定它们。
如果这还不够好,你将不得不一个接一个地做。也许写一个自定义行为?
答案 2 :(得分:1)
您可以将可见性设置为父级,而不是将其设置为每个控件
例如
<StackPanel>
<StackPanel Name="pane1">
<Button Height="30" Width="200" Content="one" Click="Button_Click" />
</StackPanel>
<StackPanel Name="panel2">
<Button Height="30" Width="200" Content="two" Click="Button_Click_1" />
</StackPanel>
</StackPanel>
在后端编写逻辑以设置stackpanel的可见性而不是每个控件
private void Button_Click(object sender, RoutedEventArgs e)
{
pane1.Visibility = Visibility.Collapsed;
panel2.Visibility = Visibility.Visible;
}
private void Button_Click_1(object sender, RoutedEventArgs e)
{
panel2.Visibility = Visibility.Collapsed;
pane1.Visibility = Visibility.Visible;
}
如果您的以下mvvm然后绑定到堆栈面板的visibility属性,如下所示
<StackPanel>
<StackPanel Visibility="{Binding CanShowPanel1}">
<Button Height="30" Width="200" Content="one" Click="Button_Click" />
</StackPanel>
<StackPanel Visibility="{Binding CanShowPanel2}">
<Button Height="30" Width="200" Content="two" Click="Button_Click_1" />
</StackPanel>
</StackPanel>
答案 3 :(得分:0)
最简单的方法是将IValueConverter
与参数一起使用。
<StackPanel>
<StackPanel Visibility="{Binding TheQuery,Converter={StaticResource QueryConverter,ConverterParameter="MyFirstStackPanelVisible"}}">
</StackPanel>
<StackPanel Visibility="{Binding TheQuery,Converter={StaticResource QueryConverter,ConverterParameter="MySecondStackPanelVisible"}}">
</StackPanel>
</StackPanel>
public class QueryConverter: IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
switch((string)parameter)
{
case "MyFirstStackPanelVisible"
bool result =CheckQueryCriteriaForFirstStackPanel();
return Visibility.Visible or Visibility.Collapsed;
case "MySecondStackPanelVisible"
bool result =CheckQueryCriteriaForSecondStackPanel();
return Visibility.Visible or Visibility.Collapsed;
}
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
当然你不应该为每个案例制作CheckQueryCriteriaFor ...函数。 这种方法保证逻辑在一个地方。