Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.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/8/xslt/3.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# StackPanel折叠并在单击按钮时可见_C#_Wpf_User Interface_Mvvm_Styles - Fatal编程技术网

C# StackPanel折叠并在单击按钮时可见

C# 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

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

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>

使用
切换按钮
代替
按钮
并绑定
堆栈面板。可见性
切换按钮。通过
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
是一个更好的选择