2011-03-30 109 views
2

在Windows Phone 7 Silverlight项目中,当折叠包含按钮的面板,然后使用硬件返回按钮返回(再次设置可见性)时,第一次点击事件丢失。Silverlight Windows Phone 7 - 使用硬件后退按钮后丢失的按钮事件

这让我疯狂了一阵子。

这里是一个简单的方法来重现,启动一个新的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; 
    } 

现在奇怪的事情:

  • 如果你使用屏幕上如果使用硬件后退按钮返回键切换工作正常
  • 切换回,则首先单击事件事后将失去!

这发生在仿真器和真实设备上。

这是一个错误?或者我做错了什么?

+0

你难住我了!在处理后退按键之后,我无法弄清楚发生了什么事情来吞下点击事件。大概这是一个过度简化,你实际上并没有试图提供应用内向后导航,只是改变某种提示的可见性?附:您应该重写'OnBackKeyPress'而不是为BackKeyPress事件添加事件处理程序。 – 2011-03-30 07:59:35

+0

感谢您的关注。是的,这是一个过分简化的例子。我试着重写OnBackKeyPress,但没有任何区别。其他人在App Hub论坛上找到了解决方法(我在下面粘贴了它)。 – Habitante 2011-03-30 09:29:35

回答

2

有人叫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; 
      } 
     } 
1

跑进这个相同的问题。看起来像一个错误(找到解决方法很好)。我写了这个简单的扩展方法变通方法:

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