C# 如何禁用Windows 8/WinRT 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

我的目标是只在特定情况下提供AppBar。我正试图通过创建AppBar来实现这一点,但在出现这种情况之前将其禁用。但是,如果将应用程序栏上的
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);
}
  • 添加以下方法:

    私有void BuildPageAppBarDictionary() { _appbarDictionary.Clear()

    }

    私有无效NullOtherAppBars(FlipView FlipView) { foreach(MyFlipView.Items中的变量项) { 如果(项目!=flipView.SelectedItem) { var page=项目作为页面

                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;
            }
        }
    }