2012-08-14 74 views
11

我的目標是在某種情況下只有一個AppBar可用。我試圖通過創建AppBar來完成此操作,但在此情況出現之前將其禁用。但是,如果將AppBar上的IsEnabled屬性設置爲False,則啓動應用程序並右鍵單擊(通常會打開AppBar),應用程序將崩潰。這是框架中的錯誤嗎?什麼是禁用AppBar的正確方法?如何禁用Windows 8/WinRT AppBar?

編輯:它也會發生時,您將Visibility設置爲Collapsed

更多信息:我通過Visual Studio調試器運行它,但彈出一個單獨的「Visual Studio Just-In-Time Debugger」窗口,顯示消息「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。安德魯Duthie - devhammer提供了我正在使用的答案。我只想補充一點,我發現最好使用this.BottomAppBar = null來禁用它,而不是設置IsEnabledVisibility屬性。如果您將Visibility設置爲Collapsed,那麼當您右鍵單擊時,應用程序仍會認爲AppBar存在,即使它不可見,所以您的下一次常規點擊將被解釋爲通常會解除AppBar的點擊,所以您必須再次點擊以實際執行您嘗試的操作。

+3

「應用程序崩潰」是什麼意思?它在框架中崩潰了嗎?在你的代碼中?你有一個調用堆棧嗎?拋出異常嗎?什麼是異常(和消息)? – 2012-08-14 18:37:59

+0

我認爲它在框架中崩潰。我通過Visual Studio調試器運行它,但彈出一個單獨的「Visual Studio Just-In-Time Debugger」窗口,並顯示消息「App.exe [2596]中發生未處理的win32異常。」彈出一個警告框,上面寫着「調試器連接到App.exe,但未配置爲調試此未處理的異常。要調試此異常,請分離當前的調試器。」 – jokeefe 2012-08-14 18:46:54

+0

我認爲我們需要更多的背景來發現問題。你可以發佈你的AppBar xaml嗎? – mydogisbox 2012-08-14 19:05:38

回答

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

這工作完美。謝謝!我發現最好使用'this.BottomAppBar = null'來禁用它,而不是設置'IsEnabled'或'Visibility'屬性。如果您只將「可見性」設置爲「摺疊」,那麼當您右鍵單擊時,應用程序仍會認爲AppBar存在,即使它不可見,所以您的下一次常規點擊將被解釋爲通常會忽略AppBar,因此您必須再次單擊以實際執行您嘗試的操作。再次感謝您的幫助! – jokeefe 2012-08-14 20:13:25

+0

我的榮幸。很高興我能幫上忙。 – devhammer 2012-08-14 20:14:32

+0

嘗試加載在xaml文件中定義的appbar資源對象失敗。但是,我成功地只使用了沒有任何xaml資源的原始代碼。 – 2013-02-13 03:35:39

2

您可以使用WinRT XAML Toolkit中的CustomAppBar。它可以以多種方式禁用 - 您可以綁定其CanOpen或CanDismiss屬性以阻止它出現或消失,這可能是您想要的。

+1

當然是的。他/她希望應用程序工作或不工作取決於條件,並且CustomAppBar提供了這一點,它不會崩潰。我創建它正是由於本機AppBar的限制/問題。 – 2012-08-14 19:56:44

+0

非常感謝您的建議,@Filip Skakun。如果我無法獲得解決方案G. Andrew Duthie - devhammer提供了工作,我肯定會走這條路。下次遇到像這樣的問題時,我會回顧一下您的圖書館。 – jokeefe 2012-08-14 20:20:19

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()」

+0

完美地工作,謝謝 – Lufi 2013-05-29 21:31:43

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

1.選擇改變的事件,您flipview控件添加在XAML文件:

<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. 添加這些方法:

    私人無效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); 
    } 
    

    }

    私人無效InitializeAppBar(FlipView flipView) { 如果(_appbarDictionary.Count> 0){ 變種 當前是= flipView.SelectedItem作爲頁; 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; 
        } 
    } 
    

    }

    私人無效NullOtherAppBars(FlipView flipView) { 的foreach(在MyFlipView.Items VAR項目) { 如果(項目!= flipView.SelectedItem) {VAR 網頁=項目作爲Page;

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

請原諒片段格式問題。 我試圖盡我所能將示例格式轉換爲此頁面。

+0

混合列表項目符號和代碼不能很好地工作(開始發佈時有同樣的問題:-) – kleopatra 2013-02-11 09:59:11