在Windows 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;
}现在奇怪的是:
这既发生在模拟器上,也发生在真正的设备上。
这是个虫子吗?或者我做错什么了?
发布于 2011-03-30 09:24:48
有人叫了Fendors (谢谢!)在app中心论坛上回答了我的问题。他没有找到原因,但找到了一个解决办法:
“当单击”硬件后退“按钮时,我没有完全搞清楚正在发生什么,但我确实找到了解决办法。我最初认为可能存在某种焦点问题,发现如果将内容面板从可见面板设置为折叠面板,则会使其处于良好状态。”
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;
}
} 发布于 2011-12-10 00:03:38
遇到了同样的问题。似乎是个bug (在解决方法上找到了一个很好的发现)。我为解决方案编写了这个简单的扩展方法:
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();
https://stackoverflow.com/questions/5483239
复制相似问题