我的目标是在某种情况下只提供AppBar。我试图通过创建一个AppBar来实现这一目标,但在这种情况出现之前将其禁用。但是,如果您将AppBar上的IsEnabled
属性设置为False
,则在启动应用并右键单击(通常会打开AppBar)时,应用程序会崩溃。这是框架中的错误吗?什么是禁用AppBar的正确方法?
编辑:当您将Visibility
设置为Collapsed
时也会出现。
更多信息:我正在通过Visual Studio调试器运行它,但是弹出一个单独的“Visual Studio即时调试器”窗口,其中显示消息“App.exe中发生了未处理的win32异常[2596]。 “弹出一个警告框,上面写着“调试器附加到App.exe但未配置为调试此未处理的异常。要调试此异常,请分离当前的调试器。”
编辑2:这不仅仅是我的代码。如果您只是在Microsoft自己的示例AppBarControl项目中添加IsEnabled="False"
到AppBar,它也会崩溃(在此处找到:http://code.msdn.microsoft.com/windowsapps/XAML-AppBar-control-sample-2aa1cbb4)
编辑3:@G。 Andrew Duthie - devhammer提供了我正在使用的答案。我只是想补充一点,我发现最好使用this.BottomAppBar = null
来禁用它,而不是设置IsEnabled
或Visibility
属性。如果您只是将Visibility
设置为Collapsed
,那么当您右键单击时,应用仍会认为AppBar存在,即使它不可见,因此您的下一次常规点击将被解释为点击通常会解雇AppBar,因此您必须再次点击才能实际执行您尝试的操作。
答案 0 :(得分:8)
我一直在玩这个(使用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仍在实例化,并在您再次需要时准备就绪)。
希望有所帮助!
答案 1 :(得分:4)
如果您仍想在XAML中定义AppBar,可以在后面的代码中以编程方式关闭AppBar。在XAML中,创建底部的AppBar:
<Page.BottomAppBar>
<AppBar Name="MyAppBar" Opened="AppBarOpened">
...
</AppBar>
</Page.BottomAppBar>
然后,在后面的C#代码中:
private void AppBarOpened(object sender, object e)
{
if ( CanAppBarOpen() == false)
{
MyAppBar.IsOpen = false;
}
}
您必须自己检查“CanAppBarOpen()”
答案 2 :(得分:2)
您可以使用WinRT XAML Toolkit中的CustomAppBar。它可以通过多种方式禁用 - 您可以绑定其CanOpen或CanDismiss属性以阻止它出现或消失,这可能是您想要的。
答案 3 :(得分:2)
您可以通过处理 AppBar
的已打开事件来执行此操作在XAML中:
<Page.BottomAppbar>
<AppBar IsEnabled="False" Visibility="Collapsed" Opened="bottomappbar_opened_event">
</Page.BottomAppbar>
在C#代码中:
private void bottomappbar_opened_event(object sender, object e)
{
if (!this.BottomAppBar.IsEnabled)
{
if (this.BottomAppBar.IsOpen)
this.BottomAppBar.IsOpen = false;
}
}
答案 4 :(得分:0)
<强> 1。将选择更改事件添加到xaml文件中的flipview控件:
<FlipView SelectionChanged="MyFlipView_SelectionChanged" />
<强> 2。将此类成员变量添加到xaml代码隐藏文件中:
Dictionary<object, Tuple<AppBar, AppBar>> _appbarDictionary = new Dictionary<object, Tuple<AppBar, AppBar>>();
第3。在此处实现FlipView的选择更改处理程序:
private void MyFlipView_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
var flipView = sender as FlipView;
BuildPageAppBarDictionary();
InitializeAppBar(flipView);
NullOtherAppBars(flipView);
}
添加以下方法:
private void BuildPageAppBarDictionary() { _appbarDictionary.Clear();
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);
}
}
private void InitializeAppBar(FlipView flipView) { if(_appbarDictionary.Count&gt; 0) { var currentPage = flipView.SelectedItem as Page; currentPage.TopAppBar = _appbarDictionary [currentPage] .Item1; currentPage.BottomAppBar = _appbarDictionary [currentPage] .Item2;
if (currentPage.TopAppBar != null)
{
currentPage.TopAppBar.IsEnabled = true;
}
if (currentPage.BottomAppBar != null)
{
currentPage.BottomAppBar.IsEnabled = true;
}
}
}
private void NullOtherAppBars(FlipView flipView) { foreach(MyFlipView.Items中的var项) { if(item!= flipView.SelectedItem) { var page = item as Page;
page.TopAppBar = null;
page.BottomAppBar = null;
}
}
}
请原谅代码段格式问题。 我尽力将示例格式设置为此页面。