C# StackPanel折叠并在单击按钮时可见
我试图在点击按钮时显示一个折叠的stackpanel,但我遇到了问题,所以我尝试反转我的想法,我能够折叠一个可见的stackpanel。但不幸的是,我无法实现我想要的行为,在单击按钮时显示一个折叠的堆栈面板。代码:D XAMLC# StackPanel折叠并在单击按钮时可见,c#,wpf,user-interface,mvvm,styles,C#,Wpf,User Interface,Mvvm,Styles,我试图在点击按钮时显示一个折叠的stackpanel,但我遇到了问题,所以我尝试反转我的想法,我能够折叠一个可见的stackpanel。但不幸的是,我无法实现我想要的行为,在单击按钮时显示一个折叠的堆栈面板。代码:D XAML <Button x:Name="sentButton" Content="Add Friend" Style="{DynamicResource FlatButtonStyle}" Margin="493,0,0,0" HorizontalAlignment="Le
<Button x:Name="sentButton" Content="Add Friend" Style="{DynamicResource FlatButtonStyle}" Margin="493,0,0,0" HorizontalAlignment="Left" Width="106"/>
<StackPanel Style="{DynamicResource stackCollapsed}" Visibility="Collapsed">
<Label Content="Invite Friends" FontWeight="Bold" Margin="0,0,477,0" Height="32" />
<StackPanel Orientation="Horizontal" Margin="26,0,0,0">
<Label Content="Enter your friend's email" Width="222" Height="25" />
<TextBox Text="{Binding Email, UpdateSourceTrigger=PropertyChanged}" Style="{DynamicResource MyTextBox}" x:Name="textBoxEmail" Width="298"/>
<Button x:Name="button1" Content="Send" Command="{Binding AddCommand}" Width="77" Style="{DynamicResource FlatButtonStyle}" Margin="20,0,0,0"/>
</StackPanel>
</StackPanel>
风格
<!-- Style Collapsed-->
<Style x:Key="stackCollapsed" TargetType="StackPanel">
<Style.Triggers>
<DataTrigger Binding="{Binding ElementName=sentButton,Path=IsPressed}" Value="true">
<Setter Property="StackPanel.Visibility" Value="Visible"/>
</DataTrigger>
</Style.Triggers>
</Style>
使用
切换按钮
代替按钮
并绑定堆栈面板。可见性
到切换按钮。通过BooleanToVisibilityConverter
转换器检查属性
<ToggleButton x:Name="sentButton" Content="Add Friend" Margin="493,0,0,0" HorizontalAlignment="Left" Width="106"/>
<StackPanel Visibility="{Binding ElementName=sentButton, Path=IsChecked, Converter={StaticResource BooleanToVisibilityConverter}}">
<Label Content="Invite Friends" FontWeight="Bold" Margin="0,0,477,0" Height="32" />
<StackPanel Orientation="Horizontal" Margin="26,0,0,0">
<Label Content="Enter your friend's email" Width="222" Height="25" />
<TextBox Text="{Binding Email, UpdateSourceTrigger=PropertyChanged}" x:Name="textBoxEmail" Width="298"/>
<Button x:Name="button1" Content="Send" Command="{Binding AddCommand}" Width="77" Margin="20,0,0,0"/>
</StackPanel>
</StackPanel>
其中,转换器定义如下
<Window.Resources>
<ResourceDictionary>
<BooleanToVisibilityConverter x:Key="BooleanToVisibilityConverter"/>
</ResourceDictionary>
</Window.Resources>
使用切换按钮
代替按钮
并绑定堆栈面板。可见性
到切换按钮。通过BooleanToVisibilityConverter
转换器检查属性
<ToggleButton x:Name="sentButton" Content="Add Friend" Margin="493,0,0,0" HorizontalAlignment="Left" Width="106"/>
<StackPanel Visibility="{Binding ElementName=sentButton, Path=IsChecked, Converter={StaticResource BooleanToVisibilityConverter}}">
<Label Content="Invite Friends" FontWeight="Bold" Margin="0,0,477,0" Height="32" />
<StackPanel Orientation="Horizontal" Margin="26,0,0,0">
<Label Content="Enter your friend's email" Width="222" Height="25" />
<TextBox Text="{Binding Email, UpdateSourceTrigger=PropertyChanged}" x:Name="textBoxEmail" Width="298"/>
<Button x:Name="button1" Content="Send" Command="{Binding AddCommand}" Width="77" Margin="20,0,0,0"/>
</StackPanel>
</StackPanel>
其中,转换器定义如下
<Window.Resources>
<ResourceDictionary>
<BooleanToVisibilityConverter x:Key="BooleanToVisibilityConverter"/>
</ResourceDictionary>
</Window.Resources>
问题在于
选项卡中的可见性
属性的优先级高于样式或触发器中设置的任何属性,因此永远不会应用触发器。有关更多详细信息,请参阅
要修复当前的解决方案,请将Visiblity属性从
标记中移到您的样式中,如下所示:
<Style x:Key="stackCollapsed" TargetType="StackPanel">
<Setter Property="Visibility" Value="Collapsed"/>
<Style.Triggers>
<DataTrigger Binding="{Binding ElementName=sentButton,Path=IsPressed}" Value="true">
<Setter Property="Visibility" Value="Visible"/>
</DataTrigger>
</Style.Triggers>
</Style>
<StackPanel Style="{DynamicResource stackCollapsed}">
...
</StackPanel>
...
也就是说,我个人建议使用带有StackPanel的切换按钮。可见性
绑定到ToggleButton。IsChecked
,比如。问题是
选项卡中的可见性
属性的优先级高于样式或触发器中设置的任何属性,所以触发器永远不会被应用。有关更多详细信息,请参阅
要修复当前的解决方案,请将Visiblity属性从
标记中移到您的样式中,如下所示:
<Style x:Key="stackCollapsed" TargetType="StackPanel">
<Setter Property="Visibility" Value="Collapsed"/>
<Style.Triggers>
<DataTrigger Binding="{Binding ElementName=sentButton,Path=IsPressed}" Value="true">
<Setter Property="Visibility" Value="Visible"/>
</DataTrigger>
</Style.Triggers>
</Style>
<StackPanel Style="{DynamicResource stackCollapsed}">
...
</StackPanel>
...
也就是说,我个人会推荐一些类似于切换按钮的东西,它将StackPanel.Visibility
绑定到ToggleButton.IsChecked
,比如。我解决了将子项设置为null的问题
stackPanel.Children.Clear();
如果您第一次需要显示/隐藏面板,则此操作有效;如果您需要执行运行时操作,则此操作无效
stackPanel.Children.Clear();
如果您第一次需要显示/隐藏面板,则此项工作不起作用;如果您需要执行运行时操作,则此项工作不起作用,因为Stackpanel很简单。可见性=可见性。折叠。就像Stackpanel一样简单。可见性=可见性。折叠。您的意思是单击一次显示,然后单击第二次隐藏吗?@dkozl是:)。类似于Javascript方法,但这是针对桌面的。您的意思是单击一次以显示“单击二次以隐藏”吗?@dkozl是:)完全正确。类似于Javascript方法,但这是针对桌面的。谢谢你的回答,你的方法可以工作,但stackpanel没有修复,就像显示和隐藏(只有在我长按按钮的情况下)@Antoine Yep,这是因为按钮。只有当你按住鼠标时,IsPressed
才是真的。这就是为什么ToggleButton
是一个更好的选择谢谢你的回答,你的方法有效,但是stackpanel没有修复,就像显示和隐藏一样(只有在我长按按钮的情况下)@Antoine Yep,那是因为按钮。只有当你按住鼠标时,IsPressed
才是真的。这就是为什么ToggleButton
是一个更好的选择