Silverlight Windows Phone 7 - событие нажатия кнопки потеряно после использования аппаратной кнопки возврата - PullRequest
2 голосов
/ 30 марта 2011

В проекте Windows Phone 7 Silverlight, при свертывании панели, содержащей кнопку, и последующем использовании аппаратной кнопки «назад» для возврата (снова задает видимость для видимой) событие ПЕРВОЕ нажатие теряется.

Это сводило меня с ума на некоторое время.

Вот простой способ воспроизвести, запустить новое приложение Wp7 silverlight и в xaml добавить две панели контента с кнопкой.

    <Grid x:Name="ContentPanel" Grid.Row="1" Visibility="Visible">
        <Button Content="Change Visibility" Click="ChangeButton_Click"/>
    </Grid>
    <Grid x:Name="ContentPanel2" Grid.Row="1" Visibility="Collapsed">
        <Button Content="Back" Click="BackButton_Click"/>
    </Grid>

В коде есть обработчики для обеих кнопок и кнопки аппаратного возврата для простого переключения видимости между двумя панелями.

    public MainPage()
    {
        InitializeComponent();
        BackKeyPress += new EventHandler<System.ComponentModel.CancelEventArgs>(MainPage_BackKeyPress);
    }

    void MainPage_BackKeyPress(object sender, System.ComponentModel.CancelEventArgs e)
    {
        if (ContentPanel2.Visibility == Visibility.Visible)
        {
            ContentPanel.Visibility = Visibility.Visible;
            ContentPanel2.Visibility = Visibility.Collapsed;
            e.Cancel = true;
        }
    }

    private void ChangeButton_Click(object sender, RoutedEventArgs e)
    {
        ContentPanel.Visibility = Visibility.Collapsed;
        ContentPanel2.Visibility = Visibility.Visible;
    }

    private void BackButton_Click(object sender, RoutedEventArgs e)
    {
        ContentPanel.Visibility = Visibility.Visible;
        ContentPanel2.Visibility = Visibility.Collapsed;
    }

А теперь странная вещь:

  • При использовании экранной кнопки переключения переключение работает нормально
  • Если вы используете аппаратную кнопку «Назад» для переключения назад, событие ПЕРВОГО нажатия впоследствии будет потеряно!

Это происходит как на эмуляторе, так и на реальном устройстве.

Это ошибка? или что я делаю не так?

Ответы [ 2 ]

2 голосов
/ 30 марта 2011

Кто-то по имени Fendors (Спасибо!) Ответил на мой вопрос на форумах app hub . Он не нашел причину, по которой это произошло, но нашел обходной путь:

«Я не совсем понял, что происходит, когда аппаратное обеспечение возвращается кнопка нажата, но нашел обходной путь. Я изначально думал возможно был какой-то фокус вопрос и обнаружил, что если вы установите панель содержимого от видимого до свернулся в видимое, он помещает его в хорошее состояние "

void MainPage_BackKeyPress(object sender, System.ComponentModel.CancelEventArgs e) 
        { 
            if (ContentPanel2.Visibility == Visibility.Visible) 
            { 
                ContentPanel2.Visibility = Visibility.Collapsed; 
                ContentPanel.Visibility = Visibility.Visible; 
                ContentPanel.Visibility = Visibility.Collapsed; 
                ContentPanel.Visibility = Visibility.Visible; 

                e.Cancel = true; 
            } 
        } 
1 голос
/ 10 декабря 2011

столкнулся с этой же проблемой.Похоже, ошибка (отличная находка на обходной путь).Я написал этот простой метод расширения для обходного пути:

public static class UIElementExtensions
{
    public static void ShowForReal(this UIElement element)
    {
        element.Visibility = Visibility.Visible;
        element.Visibility = Visibility.Collapsed;
        element.Visibility = Visibility.Visible;
    }
}

, затем просто вызовите ContentPanel.ShowForReal();

...