问题 如何禁用Windows 8 / WinRT AppBar?


我的目标是在某种情况下只提供AppBar。我试图通过创建一个AppBar来实现这一目标,但在这种情况出现之前将其禁用。但是,如果你设置了 IsEnabled AppBar上的属性 False,当您启动应用程序并右键单击(通常打开AppBar)时,应用程序崩溃。这是框架中的错误吗?禁用AppBar的正确方法是什么?

编辑:当你设置时也会发生 Visibility 至 Collapsed

更多信息:我正在通过Visual Studio调试器运行它,但是弹出一个单独的“Visual Studio即时调试器”窗口,其中显示消息“App.exe [2596]中发生了未处理的win32异常”。弹出一个警告框,上面写着“调试器附加到App.exe但未配置为调试此未处理的异常。要调试此异常,请分离当前的调试器。”

编辑2:这不仅仅是我的代码。如果你只是添加它也会崩溃 IsEnabled="False" 在微软自己的示例AppBarControl项目中找到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的点击,所以你必须点击一秒实际执行你正在尝试的行动的时间。


6795
2017-08-14 18:35


起源

“应用程序崩溃”是什么意思?它在框架中崩溃了吗?在你的代码中?你有一个callstack吗?抛出异常?什么是异常(和消息)? - James McNellis
我认为它在框架中崩溃了。我正在通过Visual Studio调试器运行它,但是弹出一个单独的“Visual Studio即时调试器”窗口,其中显示消息“App.exe [2596]中发生了未处理的win32异常”。弹出一个警告框,上面写着“调试器附加到App.exe但未配置为调试此未处理的异常。要调试此异常,请分离当前的调试器。” - jokeefe
我认为我们需要更多背景来发现问题。你可以发布你的AppBar xaml吗? - mydogisbox
您可以等待几天,看看Windows 8的发布版本是否也会引发异常 - Erno de Weerd
@mydogisbox这不只是我的代码。如果你只是添加它也会崩溃 IsEnabled="False" 在微软自己的示例AppBarControl项目中找到AppBar(在这里找到: code.msdn.microsoft.com/windowsapps/...) - jokeefe


答案:


我一直在玩这个(使用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仍然实例化,并在您再次需要时准备就绪)。

希望有所帮助!


8
2017-08-14 19:30



这工作完美。谢谢!我发现最好用 this.BottomAppBar = null 禁用它而不是设置 IsEnabled 要么 Visibility 属性。如果你只是设置 Visibility 至 Collapsed,然后当你右键单击时,应用程序仍然认为AppBar存在,即使它不可见,所以你的下一个常规点击将被解释为通常关闭AppBar的点击,所以你必须点击一秒实际执行你正在尝试的行动的时间。再次感谢您的帮助! - jokeefe
我的荣幸。很高兴我能帮上忙。 - devhammer
尝试加载xaml文件中定义的appbar资源对象失败。但是,我成功地使用了没有任何xaml资源的原始代码。 - Scott Nimrod


如果您仍想在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()”执行自己的检查


4
2017-09-05 19:43



工作完美,谢谢 - Lufi


您可以使用来自的CustomAppBar WinRT XAML工具包。它可以通过多种方式禁用 - 您可以绑定其CanOpen或CanDismiss属性以阻止它出现或消失,这可能是您想要的。


2
2017-08-14 19:01



当然可以。他/她希望appbar工作或不工作,具体取决于条件,CustomAppBar提供了这一点,它不会崩溃。我正是由于本机AppBar的/问题的限制而创建它。 - Filip Skakun
非常感谢你的建议,@ Felip Skakun。如果我无法得到解决方案G. Andrew Duthie - devhammer提供工作,我肯定会走这条路。下次遇到这样的问题时,我会回到你的图书馆。 - jokeefe


你可以通过处理这样做 打开 的事件 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;
     }
 }

2
2017-09-26 11:28





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

请原谅代码段格式问题。 我试图尽可能地将示例格式设置到此页面。


0
2018-02-11 04:14



混合列表项目符号和代码不能正常工作(开始发布时遇到同样的问题:-) - kleopatra