2012-02-24 79 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無法啓動一些奇怪的原因。)