2012-08-14 4 views
11

Il mio obiettivo è avere solo un AppBar disponibile in determinate circostanze. Sto tentando di farlo creando un AppBar, ma lasciandolo disabilitato fino a quando non si verificherà tale circostanza. Tuttavia, se si imposta l'attributo su AppBar su False, quando si avvia l'app e si fa clic con il pulsante destro del mouse (che in genere apre AppBar), l'applicazione si arresta in modo anomalo. È un bug nel framework? Qual è il modo corretto per disabilitare un AppBar?Come disabilitare Windows 8/WinRT AppBar?

MODIFICA: si verifica anche quando si imposta Visibility su Collapsed.

Altre informazioni: lo sto eseguendo tramite il debugger di Visual Studio, ma una finestra separata "Debugger di Visual Studio" viene visualizzata con il messaggio "Un'eccezione win32 non gestita si è verificata in App.exe [2596] ". Viene visualizzata una finestra di avviso che dice "Un debugger è collegato ad App.exe ma non configurato per eseguire il debug di questa eccezione non gestita." Per eseguire il debug di questa eccezione, scollegare il debugger corrente. "

EDIT 2: Non è solo il mio codice. Si blocca anche se si aggiunge solo IsEnabled="False" all'AppBar nel progetto AppBarControl di esempio di Microsoft (trovato qui: http://code.msdn.microsoft.com/windowsapps/XAML-AppBar-control-sample-2aa1cbb4)

MODIFICA 3: @G. Andrew Duthie - devhammer ha fornito la risposta che sto usando. Volevo solo aggiungere che ho trovato che è meglio usare this.BottomAppBar = null per disabilitarlo invece di impostare le proprietà IsEnabled o Visibility. Se hai impostato Visibility su Collapsed, quando fai clic con il pulsante destro del mouse, l'app pensa ancora che AppBar sia presente anche se non è visibile, quindi il tuo clic normale successivo verrà interpretato come il clic che di solito esclude l'AppBar, quindi Dovrò cliccare una seconda volta per eseguire effettivamente l'azione che stavi tentando.

+3

Che cosa significa "l'applicazione si blocca"? Crolla nel framework? Nel tuo codice? Hai un callstack? Viene lanciata un'eccezione? Qual è l'eccezione (e il messaggio)? –

+0

Penso che si stia bloccando nel framework. Lo sto eseguendo tramite il debugger di Visual Studio, ma una finestra separata di "Debugger in tempo reale di Visual Studio" sta spuntando con il messaggio "Un'eccezione win32 non gestita si è verificata in App.exe [2596]." Viene visualizzata una finestra di avviso che dice "Un debugger è collegato ad App.exe ma non configurato per eseguire il debug di questa eccezione non gestita." Per eseguire il debug di questa eccezione, scollegare il debugger corrente. " – jokeefe

+0

Penso che abbiamo bisogno di più contesto per individuare il problema. Puoi pubblicare il tuo xaml AppBar? – mydogisbox

risposta

8

Ho giocato con questo per un po '(usando sia IsEnabled, sia impostando la proprietà Visibility su Visibility.Collapsed), e l'unico modo in cui avrei potuto disabilitare l'AppBar senza sollevare l'eccezione era mostrare AppBar prima. Una volta che AppBar è stato mostrato, l'impostazione di IsEnabled su false o l'impostazione di Visibility to Visibility.Collapsed non genera più l'eccezione.

Tuttavia, se si crea l'AppBar di programmazione, in questo modo:

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; 

ma non si aggiunge al Page.BottomAppBar fino a quando la prima volta che ne avete bisogno, non sarà possibile ottenere l'eccezione.

ho testato tramite un pulsante con il seguente gestore:

private void Button_Click_1(object sender, RoutedEventArgs e) 
{ 
    if (this.BottomAppBar == null) 
    { 
     this.BottomAppBar = myAppBar; 
    } 
    else { 
     this.BottomAppBar = null; 
    } 
} 

Quando l'applicazione carica la prima volta, se si tenta di richiamare l'AppBar, non accade nulla. Fare clic sul pulsante (che aggiunge l'AppBar a Page.BottomAppBar) e richiamando l'AppBar mostrerà l'AppBar. Fare nuovamente clic sul pulsante e AppBar non viene più visualizzato (anche se myAppBar è ancora istanziato e pronto quando è necessario nuovamente).

Spero che questo aiuti!

+1

Questo funziona perfettamente. Grazie! Ho trovato che è meglio usare 'this.BottomAppBar = null' per disabilitarlo invece di impostare le proprietà' IsEnabled' o 'Visibility'. Se si imposta 'Visibilità' su' Collapsed', quando si fa clic con il pulsante destro del mouse, l'app continua a pensare che AppBar sia presente anche se non è visibile, quindi il clic successivo verrà interpretato come il clic che in genere rifiuta il AppBar, quindi dovrai fare clic una seconda volta per eseguire effettivamente l'azione che stavi tentando. Grazie ancora per l'aiuto! – jokeefe

+0

Piacere mio. Sono contento di poterti aiutare. – devhammer

+0

Il tentativo di caricare un oggetto risorsa appbar definito in un file xaml ha esito negativo. Tuttavia, sono riuscito a utilizzare solo codice raw senza risorse xaml. –

2

È possibile utilizzare CustomAppBar dal WinRT XAML Toolkit. Può essere disattivato in diversi modi: puoi associare le proprietà CanOpen o CanDismiss per impedirgli di apparire o andare via, il che potrebbe essere ciò che desideri.

+1

Ovviamente lo fa. Voleva che la appbar funzionasse o meno a seconda delle condizioni e CustomAppBar fornisce proprio questo e non si blocca. L'ho creato proprio a causa delle limitazioni/problemi con l'AppBar nativo. –

+0

Grazie mille per il tuo suggerimento, @Filip Skakun. Se non fossi riuscito a ottenere la soluzione, G. Andrew Duthie - il devhammer si è offerto di lavorare, sicuramente avrei seguito questa strada. Ricontrollo con la tua libreria la prossima volta che incontrerò un problema come questo. – jokeefe

4

Se si desidera ancora definire l'AppBar in XAML, è possibile chiudere a livello di codice l'AppBar nel codice sottostante.In XAML, creare l'AppBar fondo:

<Page.BottomAppBar> 
    <AppBar Name="MyAppBar" Opened="AppBarOpened"> 
     ... 
    </AppBar> 
</Page.BottomAppBar> 

Poi, nel codice C# dietro:

private void AppBarOpened(object sender, object e) 
{ 
    if (CanAppBarOpen() == false) 
    { 
     MyAppBar.IsOpen = false; 
    } 
} 

Dovrete implementare il proprio controllo per "CanAppBarOpen()"

+0

Funziona perfettamente, grazie – Lufi

2

È può fare come questo gestendo aperto caso di AppBar

In XAML:

<Page.BottomAppbar> 
    <AppBar IsEnabled="False" Visibility="Collapsed" Opened="bottomappbar_opened_event"> 
</Page.BottomAppbar> 

In C# Codice:

private void bottomappbar_opened_event(object sender, object e) 
{ 
    if (!this.BottomAppBar.IsEnabled) 
    { 
     if (this.BottomAppBar.IsOpen) 
     this.BottomAppBar.IsOpen = false; 
    } 
} 
0

1. Aggiungere una selezione evento modificato al vostro controllo flipview nel file XAML:

<FlipView SelectionChanged="MyFlipView_SelectionChanged" /> 

2. Aggiungere questo membro della classe variabile per il file xaml code-behind:

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

3. Implementare la selezione del FlipView cambiato gestore qui:

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

    BuildPageAppBarDictionary(); 

    InitializeAppBar(flipView); 
    NullOtherAppBars(flipView); 
} 
  1. Aggiungi questi metodi:

    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) { se (_appbarDictionary.Count> 0) { var = currentPage flipView.SelectedItem come pagina; 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 private void (FlipView FlipView) { foreach (var voce in MyFlipView.Items) { se (articolo! = FlipView.SelectedItem) { pagina var = item come Pagina;

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

ti prego di perdonare i problemi di formattazione snippet. Ho cercato di rendere il formato di esempio a questa pagina nel miglior modo possibile.

+0

i bullets di lista di missaggio e il codice non funziona bene (aveva lo stesso problema quando si inizia a postare qui :-) – kleopatra