2012-02-24 14 views
7

मेरे पास Popup है जिसमें "बंद करें" बटन है। पॉपअप को टॉगल बटन द्वारा खोला जाता है (इसकी IsOpen संपत्ति ToggleButton से जुड़ी है जैसा कि answer द्वारा प्रदान की गई है)। बटन दबाए जाने पर मैं पॉपअप को कैसे बंद कर सकता हूं? यह आपके 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> 

अस्वीकरण: मैंने इस कोड को वीएस के माध्यम से नहीं चलाया है, इसलिए इसमें टाइपो या 2

+0

यह दिलचस्प है (जैसा कि मैं एक्सएएमएल-केवल समाधान पसंद करता हूं), लेकिन यह एक अपवाद फेंकता है: "अवैधऑपरेशन अपवाद": संपत्ति में सभी संपत्ति संदर्भों को हल नहीं कर सकता पथ 'IsOpen'। सत्यापित करें कि लागू ऑब्जेक्ट गुणों का समर्थन करते हैं। " – user46874

+0

अपवाद क्या है? –

+0

(मेरी टिप्पणी संपादित की गई) – user46874

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 के राज्य की स्थापना की यह मेरी XAML है। Ischecked = झूठा;

मैं वी.एस. में परीक्षण कोड have't, इसलिए कुछ लिखने की त्रुटियों

2

अन्य उत्तर मेरे लिए काम नहीं करते थे, क्योंकि मैं पॉपअप के अंदर बटन के लिए डेटा टेम्पलेट का उपयोग कर रहा था। बहुत सारी खोजों के बाद मुझे पता चला कि मुझे स्टोरीबोर्ड का उपयोग करना चाहिए। स्टोरीबोर्ड के बजाय लक्ष्य। लक्ष्य नाम। अन्यथा एक्स: नाम नहीं मिला था और कुछ नामस्थान अपवाद था।

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

और बाद में पॉपअप एक ListBox जो कुछ 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 जो इसके अंदर बटन के साथ आदेश पर अमल कर सकते हैं पाने के लिए संभव है । (एक सामान्य कॉम्बोबॉक्स कुछ अजीब कारणों के लिए कमांड लॉन्च नहीं कर सकता है।)

संबंधित मुद्दे