2010-03-05 41 views
1

我有列表框。當我點擊列表框項目時,我必須在彈出窗口中顯示項目信息但點擊後不會關閉。我在itemsselected事件中創建彈出。如何處理彈出關閉?如何在Silverlight中關閉彈出窗口?

+1

你是如何創建彈出?如果它是通過子窗口,你應該能夠關閉它。請澄清。 – funwithcoding 2010-03-05 13:18:00

回答

0

我不太清楚「點擊邊」是什麼意思,因爲彈出窗口以模態方式進行操作。

您應該將您的彈出窗口設置爲ChildWindow。然後你可以處理Closed事件。

下面是一個非常簡單的示例,它顯示了主窗口中列表框中的選定字符串。

首先在主窗口:

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

在代碼隱藏,彈出被觸發列表中選擇更改時。只需設置一個關閉的處理程序。在這個例子中,我簡單地把選擇的列表項放入一個文本塊中,然後在關閉彈出框時,我只是將對話結果放在主窗口的文本塊中(以顯示用戶推送正確還是取消)。

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"; 
    } 

彈出當用戶按下確定或取消,因爲DialogResult的值,在彈出的代碼隱藏設置關閉:

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

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

彈出窗口不是模態的,ComboBox的下拉列表是Popup。 – AnthonyWJones 2010-03-05 14:15:11

+0

我沒有說他們是。我說他們以模態的方式行事。當您在ChildWindow上調用Show()時,在彈出窗口彈起時背景不可點擊。 – 2010-03-05 14:26:05

+0

聽起來像你混淆ChildWindow與彈出這些是兩個不同的東西。 ChildWindow是一個模板化控件,其中包含一個覆蓋面板,用於防止其他控件接收輸入。 Popup是一個輕量級的控制容器,當IsOpen爲真時,它被放置在指定偏移量的內容區上方。其餘的用戶界面仍然會收到輸入。 – AnthonyWJones 2010-03-05 15:20:21

4

一種方法是創建一個透明背景畫布您可以在打開彈出窗口的同時顯示,並附加到鼠標向下事件以關閉彈出窗口。像這樣的: -

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

代碼: -

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

需要注意的是它的重要,如果你的彈出包含可以接受,你也處理LostFocus焦點的控制。

相關問題