2012-02-24 20 views
7

Ben bir "yakın" düğmesini içeren bir Popup var. Popup bir geçiş düğmesiyle açılan (bu answer tarafından sağlanan olarak IsOpen tesiste ToggleButton bağlıdır). Düğmeye basıldığında pencereyi nasıl kapatabilirim? sizin CloseButton için olay işleyicisi eklemektir yapmanınÇocuk düğmesinin düğmesine basarak açılır pencereyi kapatın.

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

cevap

14

kodu daha iyi bir yaklaşım arkasında düğmesinin click olayı üzerinde bir olay tetikleyici kullanmaktır bazı yazım hataları olabilir:

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

Yasal Uyarı: Bende işe yaramadı bir yazım hatası ya da 2

+0

Bu ilginç (yalnızca XAML çözümünü tercih ettiğimden), ancak bir istisna atar: "InvalidOperationException": Mülkteki tüm özellik referanslarını çözemez. 'IsOpen' yolu. Uygulanabilir nesnelerin özellikleri desteklediğini doğrulayın. " – user46874

+0

İstisna nedir? –

+0

(yorumuma düzenlenmiş) – user46874

1

Tek yönlü:

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

Ve OnButtonClick olay işleyicisi içinde

sizin

TuggleButton durumunu ayarlamak Bu benim XAML olduğunu. IsChecked = false;

VS test kodu have't, böylece

2

Diğer cevapları vardır bu yüzden pop-up içindeki düğmeleri için bir DataTemplate kullanıyordum çünkü VS aracılığıyla bu kodu çalıştırmak değil. lot en arama sonra ben Storyboard.Target yerine Storyboard.TargetName kullanması gerektiğini gördük. Aksi halde x: Name bulunamadı ve bazı ad alanı istisnası vardı.

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

Ve daha sonra bazı ItemsSource doldurulan bir liste kutusu vardır Popup iç:

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

o içindeki düğmelerle komutları yürütebilirsiniz biraz çalışma ComboBox almak mümkündür Bu şekilde . (Normal bir ComboBox bazı garip nedenler için komutları başlatılamıyor.)

İlgili konular