2012-02-24 4 views
7

「閉じる」ボタンを含む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> 

答えて

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

+0

例外は何ですか? –

+0

(私のコメント編集) – user46874

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でテストされたコードをhave't、ので、いくつかのタイプミス

2

その他の回答は、ポップアップ内のボタンにDataTemplateを使用していたため、たくさんの検索の後、私はStoryboard.TargetNameの代わりにStoryboard.Targetを使うべきであることが分かった。それ以外の場合、x:Nameは見つかりませんでしたが、いくつかの名前空間の例外がありました。いくつかのItemsSourceから移入されたリストボックスを持っているポップアップ内部

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

以降:

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

それの内側のボタンでコマンドを実行することができ、多少の作業コンボボックスを取得することが可能である。この方法。

関連する問題