【问题标题】:Close popup from child button's press?按下子按钮关闭弹出窗口?
【发布时间】:2012-02-24 19:39:30
【问题描述】:

我有一个包含“关闭”按钮的Popup。弹出窗口由一个切换按钮打开(其IsOpen 属性绑定到ToggleButton,由answer 提供)。按下按钮时如何关闭弹出窗口?这是我的 XAML:

<Canvas x:Name="LayoutRoot">
    <ToggleButton x:Name="ToggleButton"
            Style="{DynamicResource ToggleButtonStyle}" Height="51" Canvas.Left="2.999" Width="50.333" IsHitTestVisible="{Binding ElementName=Popup, Path=IsOpen, Mode=OneWay, Converter={StaticResource BoolInverter}}"/>
    <Popup x:Name="Popup" IsOpen="{Binding IsChecked, ElementName=ToggleButton}" StaysOpen="False" AllowsTransparency="True">
        <Canvas Height="550" Width="550">
            <Grid Height="500" Width="500" Canvas.Left="25" Canvas.Top="25" d:LayoutOverrides="Width, Height, Margin">
                <Grid.Effect>
                    <DropShadowEffect BlurRadius="15" ShadowDepth="0"/>
                </Grid.Effect>
                <Grid.RowDefinitions>
                    <RowDefinition Height="0.132*"/>
                    <RowDefinition Height="0.868*"/>
                </Grid.RowDefinitions>
                <Rectangle x:Name="Background" Fill="#FFF4F4F5" Margin="0" Stroke="Black" RadiusX="6" RadiusY="6" Grid.RowSpan="2"/>
                <Border x:Name="TitleBar" BorderThickness="1" Height="70" VerticalAlignment="Top" Margin="0,0.5,0,0" CornerRadius="5">
                    <DockPanel>
                        <TextBlock TextWrapping="Wrap" Text="FOOBAR POPUP TITLE" FontSize="24" FontFamily="Arial Narrow" Margin="17,0,0,0" d:LayoutOverrides="Height" VerticalAlignment="Center" FontWeight="Bold"/>
                        <Button x:Name="CloseButton" Content="Button" VerticalAlignment="Center" DockPanel.Dock="Right" HorizontalAlignment="Right" Margin="0,0,13,0" Style="{DynamicResource CloseButtonStyle}"/>
                    </DockPanel>
                </Border>
                <Border BorderThickness="1" Height="413" Grid.Row="1" Background="#FF2F2F2F" Margin="12">
                    <Rectangle Fill="#FFF4F4F5" RadiusY="6" RadiusX="6" Stroke="Black" Margin="12"/>
                </Border>
            </Grid>
        </Canvas>
    </Popup>
</Canvas>

【问题讨论】:

    标签: wpf


    【解决方案1】:

    比后面的代码更好的方法是在按钮点击事件上使用事件触发器:

    <Button>
        <Button.Triggers>
            <EventTrigger RoutedEvent="Button.Click">
                <BeginStoryboard>
                    <Storyboard>
                        <BooleanAnimationUsingKeyFrames Storyboard.TargetProperty="IsChecked" Storyboard.TargetName="ToggleButton">
                            <DiscreteBooleanKeyFrame KeyTime="0:0:0" Value="False" />
                        </BooleanAnimationUsingKeyFrames>
                    </Storyboard>
                </BeginStoryboard>
            </EventTrigger>
        </Button.Triggers>
    </Button>
    

    免责声明:我没有通过 VS 运行此代码,因此可能有错字或 2

    【讨论】:

    • 这很有趣(因为我更喜欢 XAML-only 解决方案),但它会引发异常:“InvalidOperationException: 无法解析属性路径 'IsOpen' 中的所有属性引用。验证适用的对象是否支持属性。”
    • 尝试将IsOpen 替换为ToggleButton.IsOpen。不幸的是,如果没有 IDE,我无法检查行为!
    • 实际上,用IsChecked 替换IsOpen 是有效的(解压ToggleButton 导致Popup 通过属性绑定关闭)。谢谢! (请更新您的答案):)
    【解决方案2】:

    其他答案对我不起作用,因为我使用 DataTemplate 作为弹出窗口内的按钮。经过大量搜索后,我发现我应该使用 Storyboard.Target 而不是 Storyboard.TargetName。否则找不到 x:Name 并且有一些命名空间异常。

    <ToggleButton x:Name="MyToggleButtonName" Content="{Binding MyToggleButtonString}"/>
    

    稍后在具有从某些 ItemsSource 填充的 ListBox 的 Popup 中:

    <ListBox.ItemTemplate>
    <DataTemplate>
    <Button Content="{Binding Name, Mode=OneWay}"
                      Command="{StaticResource MyCommandThatTakesAParameter}"
                      CommandParameter="{Binding Name}">
        <Button.Triggers>
            <EventTrigger RoutedEvent="Button.Click">
                <BeginStoryboard>
                    <Storyboard>
                        <BooleanAnimationUsingKeyFrames Storyboard.TargetProperty="IsChecked" Storyboard.Target="{Binding ElementName=MyToggleButtonName}">
                        </BooleanAnimationUsingKeyFrames>
                    </Storyboard>
                </BeginStoryboard>
            </EventTrigger>
        </Button.Triggers>
    </Button>
    </DataTemplate>
    </ListBox.ItemTemplate>
    

    这样可以得到一个有点工作的组合框,它可以使用里面的按钮执行命令。 (由于某些奇怪的原因,普通的 ComboBox 无法启动命令。)

    【讨论】:

      【解决方案3】:

      一种方法是为您的 CloseButton 添加事件处理程序:

      <Button x:Name="CloseButton" Click="OnButtonClick" Content="Button" VerticalAlignment="Center" DockPanel.Dock="Right" HorizontalAlignment="Right" Margin="0,0,13,0" Style="{DynamicResource CloseButtonStyle}"/>
      

      并在 OnButtonClick 事件处理程序中设置您的状态

      TuggleButton.IsChecked = false;

      我没有在VS中测试过代码,所以可能有一些错别字

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-10-17
        • 1970-01-01
        • 2018-01-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-03-11
        • 2014-03-16
        相关资源
        最近更新 更多