2012-02-24 78 views
7

我有一个Popup包含一个“关闭”按钮。弹出窗口通过切换按钮打开(其IsOpen属性绑定到ToggleButton,由此answer提供)。按下按钮时如何关闭弹出窗口?这是我的XAML:这样做是添加事件处理程序为您CloseButton的从儿童按钮的新闻关闭弹出?

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

回答

14

不是代码的一种更好的方法背后,是对按钮单击事件使用事件触发:

<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

+0

这很有趣(因为我更喜欢仅XAML解决方案),但它引发了一个异常:“InvalidOperationException”:无法解析属性中的所有属性引用路径'IsOpen'。验证适用的对象是否支持这些属性。“ – user46874 2012-02-24 20:29:59

+0

什么是例外? – 2012-02-24 20:30:18

+0

(编辑我的评论) – user46874 2012-02-24 20:31:26

1

方式一:

<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;

我have't在VS测试的代码,所以可能有一些错别字

2

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

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

,后来它具有从一些的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无法启动一些奇怪的原因。)