2010-03-05 5 views
1

J'ai ListBox. quand je clique sur l'élément ListBox je dois montrer l'information d'article dans le popup Mais il ne ferme pas après avoir cliqué dehors. Je crée un popup dans l'événement itemsselected. comment gérer popup fermer?Comment fermer popup dans silverlight?

+1

Comment créez-vous le popup? Si c'est à travers childwindow, vous devriez être capable de le fermer. pls clarifier. – funwithcoding

Répondre

0

Je ne suis pas sûr de ce que vous entendez par "cliquer sur le côté" parce que les fenêtres contextuelles agissent de façon modale.

Vous devez configurer votre fenêtre contextuelle comme ChildWindow. Ensuite, vous pouvez gérer l'événement Closed.

Voici un exemple très simple qui montre une chaîne sélectionnée à partir d'une liste dans une fenêtre principale.

D'abord la fenêtre principale:

<UserControl x:Class="PopupTest.MainPage" 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
mc:Ignorable="d" 
d:DesignHeight="300" d:DesignWidth="400"> 

<Grid x:Name="LayoutRoot" Background="White"> 
    <StackPanel Orientation="Vertical"> 
     <ListBox x:Name="SomeList" Width="100" Height="100" /> 
     <TextBlock x:Name="DialogResult" Width="100" /> 
    </StackPanel> 
</Grid> 

Dans le codebehind, la fenêtre est déclenchée lorsque la sélection change de liste. Il suffit de configurer un gestionnaire fermé. Dans cet exemple, je mets simplement l'élément de liste choisi dans un bloc de texte, puis à la fermeture du popup, je mets simplement le résultat de la boîte de dialogue dans un bloc de texte dans la fenêtre principale (pour montrer si l'utilisateur a poussé ok ou annuler).

public MainPage() 
    { 
     InitializeComponent(); 
     SomeList.SelectionChanged += new SelectionChangedEventHandler(SomeList_SelectionChanged); 

     SomeList.Items.Add("one"); 
     SomeList.Items.Add("two"); 
     SomeList.Items.Add("three"); 
    } 

    void SomeList_SelectionChanged(object sender, SelectionChangedEventArgs e) 
    { 
     var popup = new SomePopup(); 
     popup.Closed += new EventHandler(popup_Closed); 
     popup.ChosenItem.Text = (string)SomeList.SelectedItem; 
     DialogResult.Text = ""; 
     popup.Show(); 
    } 

    void popup_Closed(object sender, EventArgs e) 
    { 
     var popup = sender as SomePopup; 
     if (popup.DialogResult == true) 
      DialogResult.Text = "Ok"; 
     else 
      DialogResult.Text = "Cancel"; 
    } 

La fenêtre contextuelle se ferme lorsque l'utilisateur appuie sur OK ou Annuler, parce que la valeur DialogResult est définie dans le code-behind de la fenêtre contextuelle:

 private void OKButton_Click(object sender, RoutedEventArgs e) 
    { 
     this.DialogResult = true; 
    } 

    private void CancelButton_Click(object sender, RoutedEventArgs e) 
    { 
     this.DialogResult = false; 
    } 
+2

Les popups ne sont pas modaux, la liste déroulante d'un ComboBox est un Popup. – AnthonyWJones

+0

Je n'ai pas dit qu'ils l'étaient. J'ai dit qu'ils agissent de façon modale. Lorsque vous appelez Show() sur un ChildWindow, l'arrière-plan est déclicable lorsque le popup est en place. –

+0

On dirait que vous confondez ChildWindow avec Popup ce sont deux choses différentes. Une fenêtre ChildWindow est un contrôle basé sur un modèle qui inclut un panneau de superposition qui empêche les autres contrôles de recevoir des entrées. Un Popup est un conteneur de contrôle léger placé au-dessus de la zone de contenu à un décalage spécifié lorsque IsOpen est défini sur true. Le reste de l'interface utilisateur qui l'entoure recevra toujours des informations. – AnthonyWJones

4

Une approche est de créer une toile avec un fond transparent vous rendre visible en même temps que l'ouverture du Popup et attacher à est l'événement de souris vers le bas pour fermer le popup. Comme ceci: -

Xaml: -

<Grid x:Name="LayoutRoot" Background="White" > 

    <Grid.RowDefinitions> 
     <RowDefinition Height="*" /> 
     <RowDefinition Height="Auto" /> 
    </Grid.RowDefinitions> 

     <Popup x:Name="MyPopup" Closed="MyPopup_Closed" HorizontalOffset="100" VerticalOffset="100" Opened="Popup_Opened"> 
      <ListBox x:Name="PopupChild" MaxHeight="300" LostFocus="PopupChild_LostFocus"> 
       <sys:String>Hello World</sys:String> 
      </ListBox> 
     </Popup> 

     <Button Content="Open Popup" Grid.Row="1" Click="Button_Click" /> 

    <Canvas x:Name="PopupOpen" Visibility="Collapsed" Background="Transparent" Grid.RowSpan="2" MouseLeftButtonDown="PopupOpen_MouseLeftButtonDown" /> 

</Grid> 

Code: -

private void Button_Click(object sender, RoutedEventArgs e) 
    { 
     MyPopup.IsOpen = true; 
    } 

    private void Popup_Opened(object sender, EventArgs e) 
    { 
     PopupOpen.Visibility = Visibility.Visible; 
    } 

    private void PopupChild_LostFocus(object sender, RoutedEventArgs e) 
    { 
     MyPopup.IsOpen = false; 
    } 

    private void PopupOpen_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) 
    { 
     MyPopup.IsOpen = false; 
    } 

    private void MyPopup_Closed(object sender, EventArgs e) 
    { 
     PopupOpen.Visibility = Visibility.Collapsed; 
    } 

Notez que son important que si votre pop-up contient un contrôle qui peut recevoir le focus que vous gérez également LostFocus.