2016-05-23 54 views
0

我试图在按钮上单击显示一个折叠的堆叠面板,但是我遇到了问题,所以我尝试反转我的想法,并且我能够折叠可见的堆栈面板。但不幸的是,我无法实现我想要的行为,在按钮单击时显示折叠堆栈面板。为了验证码:dStackPanel在按钮上折叠并可见按一下

XAML

<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> 
+0

你的意思是点击一次显示点击第二次隐藏? – dkozl

+0

@dkozl是的:)完全。就像一个Javascript方法,但这是桌面。 – Antoine

回答

2

代替Button使用ToggleButton并通过BooleanToVisibilityConverter转换器结合StackPanel.VisibilityToggleButton.IsChecked财产

<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> 
+0

谢谢,它的工作:) – Antoine

1

的问题是在<StackPanel>标签中的Visibility属性采用比什么在伴奏或触发器设置一个更高的优先级,所以触发器永远不会被施加。有关更多详细信息,请参阅Dependency Property Precedence List

要解决当前的解决方案,移动Visibliity财产出<StackPanel>标签,进入你的风格,就像这样:

<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,如this answer suggests

+0

感谢您的答案,你的方法工作,但堆栈面板没有修复,就像显示和隐藏(只有当我长按按钮) – Antoine

+0

@Antoine是的,这是因为'Button.IsPressed'只有当你把鼠标放在它上面时才是真实的。这就是为什么'ToggleButton'是更好的选择。 :) – Rachel