我的目标是在某种情况下只提供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的点击,所以你必须点击一秒实际执行你正在尝试的行动的时间。
我一直在玩这个(使用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>
然后,在C#代码后面:
private void AppBarOpened(object sender, object e)
{
if ( CanAppBarOpen() == false)
{
MyAppBar.IsOpen = false;
}
}
您必须对“CanAppBarOpen()”执行自己的检查
您可以使用来自的CustomAppBar WinRT XAML工具包。它可以通过多种方式禁用 - 您可以绑定其CanOpen或CanDismiss属性以阻止它出现或消失,这可能是您想要的。
你可以通过处理这样做 打开 的事件 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;
}
}
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> 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;
}
}
}
请原谅代码段格式问题。
我试图尽可能地将示例格式设置到此页面。