11

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

编辑:当您设置VisibilityCollapsed.

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

编辑2:这不仅仅是我的代码。如果您只是添加IsEnabled="False"到 Microsoft 自己的示例 AppBarControl 项目中的 AppBar,它也会崩溃(可在此处找到:http ://code.msdn.microsoft.com/windowsapps/XAML-AppBar-control-sample-2aa1cbb4 )

编辑 3:@G。Andrew Duthie - devhammer 提供了我正在使用的答案。我只是想补充一点,我发现最好使用this.BottomAppBar = null禁用它而不是设置IsEnabledorVisibility属性。如果您只是设置VisibilityCollapsed,那么当您右键单击时,应用程序仍然认为 AppBar 存在,即使它不可见,因此您的下一次常规单击将被解释为通常关闭 AppBar 的单击,因此您将必须再次单击才能实际执行您尝试的操作。

4

5 回答 5

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 仍被实例化并在您再次需要时准备就绪)。

希望有帮助!

于 2012-08-14T19:30:35.797 回答
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()”

于 2012-09-05T19:43:36.060 回答
2

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

于 2012-08-14T19:01:07.713 回答
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;
     }
 }
于 2012-09-26T11:28:04.780 回答
0

1. Add a selection changed event to your flipview control in the xaml file:

<FlipView SelectionChanged="MyFlipView_SelectionChanged" />

2. Add this class member variable to your xaml code-behind file:

Dictionary<object, Tuple<AppBar, AppBar>> _appbarDictionary = new Dictionary<object, Tuple<AppBar, AppBar>>();

3. Implement the FlipView's selection changed handler here:

private void MyFlipView_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
    var flipView = sender as FlipView;

    BuildPageAppBarDictionary();

    InitializeAppBar(flipView);
    NullOtherAppBars(flipView);
}
  1. Add these methods:

    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 (var item in MyFlipView.Items) { if (item != flipView.SelectedItem) { var page = item as Page;

                page.TopAppBar = null;
                page.BottomAppBar = null;
            }
        }
    }
    

Please forgive the snippet formatting issues. I tried to make the example format to this page as best as I could.

于 2013-02-11T04:14:22.893 回答