Как закрыть всплывающее окно в silverlight? - PullRequest
1 голос
/ 05 марта 2010

У меня есть ListBox.когда я нажимаю на элемент ListBox, я должен показывать информацию об элементе во всплывающем окне, но он не закрывается после щелчка.Я создаю всплывающее окно в событиях selectedselected.как обрабатывать всплывающие окна?

Ответы [ 3 ]

4 голосов
/ 05 марта 2010

Один из подходов заключается в создании холста с прозрачным фоном, который вы делаете видимым одновременно с открытием всплывающего окна и присоединением к нему события Mouse down для закрытия всплывающего окна. Как это: -

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.

1 голос
/ 27 марта 2010

Это похоже на вопрос, который у меня был. Взгляните на Как закрыть всплывающее окно в Silverlight при нажатии за пределами элемента управления? . В своем решении я опубликовал метод расширения, который очень помогал закрывать всплывающие окна при нажатии за ними.

0 голосов
/ 05 марта 2010

Я не совсем уверен, что вы подразумеваете под "щелчком по сторонам", потому что всплывающие окна действуют модально.

Вы должны настроить ваше всплывающее окно как 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>

В заднем коде всплывающее окно запускается при изменении выбора списка.Просто настройте закрытый обработчик.В этом примере я просто помещаю выбранный элемент списка в текстовый блок, затем после закрытия всплывающего окна я просто помещаю результат диалога в текстовый блок в главном окне (чтобы показать, нажал ли пользователь ok или отменить).

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

Всплывающее окно закрывается, когда пользователь нажимает Ok или Cancel, потому что значение DialogResult установлено в коде позади всплывающего окна:

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

    private void CancelButton_Click(object sender, RoutedEventArgs e)
    {
        this.DialogResult = false;
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...