C# 如何禁用Windows 8/WinRT AppBar?
我的目标是只在特定情况下提供AppBar。我正试图通过创建AppBar来实现这一点,但在出现这种情况之前将其禁用。但是,如果将应用程序栏上的C# 如何禁用Windows 8/WinRT AppBar?,c#,windows-8,microsoft-metro,windows-runtime,winrt-xaml,C#,Windows 8,Microsoft Metro,Windows Runtime,Winrt Xaml,我的目标是只在特定情况下提供AppBar。我正试图通过创建AppBar来实现这一点,但在出现这种情况之前将其禁用。但是,如果将应用程序栏上的IsEnabled属性设置为False,则在启动应用程序并右键单击(通常会打开应用程序栏)时,应用程序会崩溃。这是框架中的一个bug吗?禁用AppBar的正确方法是什么 编辑:当您将可见性设置为折叠时,也会发生此情况 更多信息:我正在通过Visual Studio调试器运行它,但会弹出一个单独的“Visual Studio实时调试器”窗口,其中显示消息“Ap
IsEnabled
属性设置为False
,则在启动应用程序并右键单击(通常会打开应用程序栏)时,应用程序会崩溃。这是框架中的一个bug吗?禁用AppBar的正确方法是什么
编辑:当您将可见性
设置为折叠
时,也会发生此情况
更多信息:我正在通过Visual Studio调试器运行它,但会弹出一个单独的“Visual Studio实时调试器”窗口,其中显示消息“App.exe[2596]中发生未处理的win32异常”。顶部会弹出一个警告框,上面写着“调试器已附加到App.exe,但未配置为调试此未处理的异常。要调试此异常,请分离当前调试器。“
编辑2:这不仅仅是我的代码。如果您只是将IsEnabled=“False”
添加到Microsoft自己的示例AppBarControl项目中的AppBar,它也会崩溃(在此处找到:)
编辑3:@G.Andrew Duthie-devhammer提供了我正在使用的答案。我只是想补充一点,我发现最好使用
this.BottomAppBar=null
来禁用它,而不是设置IsEnabled
或Visibility
属性。如果您只是将Visibility
设置为折叠
,那么当如果单击鼠标右键,应用程序仍会认为某个应用程序栏存在,即使它不可见,因此您下一次的常规单击将被解释为通常会取消应用程序栏的单击,因此您必须再次单击以实际执行您尝试的操作。您可以从中使用CustomAppBar。它可以在多个应用程序中禁用多种方式-您可以绑定其CanOpen或CanDismiss属性来阻止它出现或消失,这可能是您想要的。我已经玩了一段时间了(使用IsEnabled和将Visibility属性设置为Visibility.Collapsed),在不引发异常的情况下成功禁用AppBar的唯一方法是首先显示AppBar。显示AppBar后,将IsEnabled设置为false,或将Visibility设置为Visibility。Collapsed不再引发异常
但是,如果以编程方式创建AppBar,如下所示:
myAppBar = new AppBar();
StackPanel sp = new StackPanel();
sp.Orientation = Orientation.Horizontal;
Button myButton = new Button();
myButton.Content = "Click Me";
sp.Children.Add(myButton);
myAppBar.Content = sp;
但是,在您第一次需要它之前,不要将其添加到Page.BottomAppBar,您不会得到异常
我使用带有以下处理程序的按钮进行了测试:
private void Button_Click_1(object sender, RoutedEventArgs e)
{
if (this.BottomAppBar == null)
{
this.BottomAppBar = myAppBar;
}
else {
this.BottomAppBar = null;
}
}
当应用程序第一次加载时,如果您尝试调用AppBar,则不会发生任何事情。单击该按钮(将AppBar添加到Page.BottomAppBar),调用AppBar将显示AppBar。再次单击该按钮,AppBar将不再显示(尽管myAppBar仍然是实例化的,并且在您再次需要时已准备就绪)
希望这会有所帮助!如果您仍然希望在XAML中定义AppBar,可以在代码隐藏中以编程方式关闭AppBar。在XAML中,创建底部AppBar:
<Page.BottomAppBar>
<AppBar Name="MyAppBar" Opened="AppBarOpened">
...
</AppBar>
</Page.BottomAppBar>
您必须对“CanAppBarOpen()”执行自己的检查。您可以通过处理AppBar的打开事件来执行此操作 在XAML中:
<Page.BottomAppbar>
<AppBar IsEnabled="False" Visibility="Collapsed" Opened="bottomappbar_opened_event">
</Page.BottomAppbar>
1.将选择更改事件添加到xaml文件中的flipview控件:
<FlipView SelectionChanged="MyFlipView_SelectionChanged" />
Dictionary<object, Tuple<AppBar, AppBar>> _appbarDictionary = new Dictionary<object, Tuple<AppBar, AppBar>>();
private void MyFlipView_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
var flipView = sender as FlipView;
BuildPageAppBarDictionary();
InitializeAppBar(flipView);
NullOtherAppBars(flipView);
}
page.TopAppBar = null;
page.BottomAppBar = null;
}
}
}
我尽可能地将示例格式应用于此页面。什么是“应用程序崩溃”意思?它在框架中崩溃吗?在代码中崩溃吗?是否有调用堆栈?是否引发异常?异常(和消息)是什么?我认为它在框架中崩溃了。我正在通过Visual Studio调试器运行它,但是一个单独的“Visual Studio实时调试器”窗口弹出,显示消息“App.exe[2596]中发生了未处理的win32异常。”顶部弹出一个警告框,上面写着调试器已附加到App.exe,但未配置为调试此未处理的异常。若要调试此异常,请分离当前调试器。“我认为我们需要更多的上下文来发现问题。你能发布你的AppBar xaml吗?你可以等几天,看看Windows 8的发行版是否引发异常too@mydogisbox这不仅仅是我的代码。如果在Microsoft自己的示例AppBarControl项目中将
IsEnabled=“False”
添加到AppBar,它也会崩溃(可在此处找到:)当然可以。他/她希望appbar根据条件工作或不工作,CustomAppBar提供了这一点,它不会崩溃。我创建它正是因为本地appbar的限制/问题。非常感谢你的建议,@Filip Skakun。如果我无法获得解决方案,G.Andrew Duthie-devhammer pr如果我愿意工作,我肯定会走这条路。下次遇到这样的问题时,我会向您的库查询。这工作做得很好。谢谢!我发现最好使用this.BottomAppBar=null
禁用它,而不是设置IsEnabled
或可见性
属性必须将可见性
设置为折叠
,然后当您右键单击时,应用程序仍然认为某个AppBar存在,即使它不可见,因此您的下一次常规单击将被解释为通常会取消AppBar的单击,因此您必须再次单击以实际执行您尝试的操作。Th再次感谢你的帮助!我的荣幸。很高兴我能帮助你
private void MyFlipView_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
var flipView = sender as FlipView;
BuildPageAppBarDictionary();
InitializeAppBar(flipView);
NullOtherAppBars(flipView);
}
foreach (var item in MyFlipView.Items)
{
var page = item as Page;
Tuple<AppBar, AppBar> appbars = new Tuple<AppBar, AppBar>(page.TopAppBar, page.BottomAppBar);
_appbarDictionary.Add(page, appbars);
}
if (currentPage.TopAppBar != null)
{
currentPage.TopAppBar.IsEnabled = true;
}
if (currentPage.BottomAppBar != null)
{
currentPage.BottomAppBar.IsEnabled = true;
}
}
page.TopAppBar = null;
page.BottomAppBar = null;
}
}
}