【问题标题】:Silverlight Windows Phone 7 - Button click event lost after using hardware back buttonSilverlight Windows Phone 7 - 使用硬件后退按钮后按钮单击事件丢失
【发布时间】:2011-03-30 07:28:25
【问题描述】:

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

现在奇怪的是:

  • 如果您使用屏幕上的后退按钮切换效果很好
  • 如果使用硬件后退按钮切换回来,那么之后的FIRST点击事件将会丢失!

这在模拟器和真实设备上都会发生。

这是一个错误吗?还是我做错了什么?

【问题讨论】:

  • 你把我难住了!在处理后退按键后,我无法弄清楚发生了什么吞下点击事件。大概这是一种过度简化,您实际上并没有尝试提供应用内向后导航,只是改变某种提示的可见性?附言您可能应该覆盖 OnBackKeyPress 而不是为 BackKeyPress 事件添加事件处理程序。
  • 感谢您的调查。是的,这是一个过于简单的例子。我尝试覆盖 OnBackKeyPress 但它没有任何区别。其他人在 App Hub 论坛上找到了解决方法(我将其粘贴在下面)。

标签: silverlight events windows-phone-7 button visibility


【解决方案1】:

有人叫 Fendors(谢谢!)在app hub forums 上回答了我的问题。他没有找到发生的原因,但找到了解决方法:

“我没有完全弄清楚什么是 硬件恢复时发生 按钮被点击,但确实找到了 解决方法。我最初在想 也许有某种焦点 问题,发现如果你设置 内容面板从可见到 折叠到可见,它把它放入 好状态”

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

【讨论】:

    【解决方案2】:

    遇到了同样的问题。似乎是一个错误(在解决方法中找到了很好的发现)。我为解决方法编写了这个简单的扩展方法:

    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();

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多