如何禁用Windows 8 / WinRT AppBar?

时间:2012-08-14 18:36:00

标签: c# windows-8 microsoft-metro windows-runtime winrt-xaml

我的目标是在某种情况下只提供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来禁用它,而不是设置IsEnabledVisibility属性。如果您只是将Visibility设置为Collapsed,那么当您右键单击时,应用仍会认为AppBar存在,即使它不可见,因此您的下一次常规点击将被解释为点击通常会解雇AppBar,因此您必须再次点击才能实际执行您尝试的操作。

5 个答案:

答案 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);
}
  1. 添加以下方法:

    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;
            }
        }
    }
    
  2. 请原谅代码段格式问题。 我尽力将示例格式设置为此页面。