2012-02-24 15 views
7

Ho un Popup che contiene un pulsante "Chiudi". Il popup viene aperto da un pulsante di attivazione/disattivazione (la sua proprietà IsOpen è associata a un valore ToggleButton come previsto da questo answer). Come posso chiudere il popup quando viene premuto il pulsante? Questo è il mio XAML:Chiudi popup dalla pressione del pulsante secondario?

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

risposta

14

Un approccio migliore rispetto al codice è dietro di utilizzare un trigger di evento in evento pulsante di scatto:

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

Dichiarazione di non responsabilità: non ho eseguito questo codice tramite VS, quindi potrebbe avere un errore di battitura o 2

+0

Questo è interessante (poiché preferisco la soluzione solo XAML), ma genera un'eccezione: "' InvalidOperationException': Impossibile risolvere tutti i riferimenti di proprietà nella proprietà percorso 'IsOpen'. Verificare che gli oggetti applicabili supportino le proprietà. " – user46874

+0

Qual è l'eccezione? –

+0

(modificato il mio commento) – user46874

1

Un modo per farlo è quello di aggiungere gestore di eventi per il vostro CloseButton:

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

E nel gestore di eventi onButtonClick stato impostato della vostra

TuggleButton. IsChecked = falso;

ho have't codice testato in VS, quindi ci potrebbero essere alcuni errori di battitura

2

Altre risposte non hanno funzionato per me, perché stavo usando un DataTemplate per i pulsanti all'interno del popup. Dopo molte ricerche ho scoperto che dovrei usare Storyboard.Target invece di Storyboard.TargetName. In caso contrario, x: Name non è stato trovato e c'era qualche eccezione nello spazio dei nomi.

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

E successivamente all'interno della un'altra che ha una ListBox che è popolata da qualche 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> 

questo modo è possibile ottenere un ComboBox po di lavoro che può eseguire comandi con i tasti suo interno . (Un ComboBox normale non può avviare comandi per qualche strano motivo.)

Problemi correlati