从子按钮的按下关闭弹出窗口?

时间:2012-02-24 19:39:30

标签: wpf

我有Popup,其中包含“关闭”按钮。弹出窗口由切换按钮打开(其IsOpen属性绑定到此answer提供的ToggleButton。如何在按下按钮时关闭弹出窗口?这是我的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>

3 个答案:

答案 0 :(得分:15)

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

<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

答案 1 :(得分:2)

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

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

稍后在Popup中有一个ListBox,它从一些ItemsSource填充:

<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,它可以用里面的按钮执行命令。 (正常的ComboBox由于某些奇怪的原因无法启动命令。)

答案 2 :(得分:1)

这样做的一种方法是为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中测试过代码,因此可能存在一些拼写错误