2012-08-14 21 views
11

Mi objetivo es tener disponible solo una AppBar bajo ciertas circunstancias. Estoy intentando lograr esto creando una AppBar, pero dejándola desactivada hasta que surja esa circunstancia. Sin embargo, si configura el atributo IsEnabled en una AppBar en False, cuando inicia la aplicación y hace clic con el botón derecho (que generalmente abre la AppBar), la aplicación falla. ¿Es esto un error en el marco? ¿Cuál es la forma correcta de desactivar una AppBar?Cómo deshabilitar Windows 8/WinRT AppBar?

EDITAR: También se produce cuando establece Visibility en Collapsed.

Más información: Lo estoy ejecutando a través del depurador de Visual Studio, pero está apareciendo una ventana separada "Visual Studio Just-In-Time Debugger" con el mensaje "Se produjo una excepción Win32 no controlada en App.exe [2596] " Aparece un cuadro de advertencia sobre el que dice "Un depurador está conectado a App.exe pero no está configurado para depurar esta excepción no controlada. Para depurar esta excepción, desconecte el depurador actual".

EDIT 2: No es solo mi código. También se bloquea si simplemente agrega IsEnabled="False" a la AppBar en el proyecto de ejemplo AppBarControl de Microsoft (se encuentra aquí: http://code.msdn.microsoft.com/windowsapps/XAML-AppBar-control-sample-2aa1cbb4)

EDIT 3: @G. Andrew Duthie: Devhammer me dio la respuesta que estoy usando. Solo quería agregar que encontré que es mejor usar this.BottomAppBar = null para desactivarlo en lugar de configurar las propiedades IsEnabled o Visibility. Si acaba de configurar Visibility en Collapsed, cuando haga clic con el botón derecho, la aplicación aún piensa que hay una AppBar presente aunque no esté visible, por lo que su siguiente clic regular se interpretará como el clic que normalmente desactiva la AppBar, por lo que Tendrás que hacer clic por segunda vez para llevar a cabo la acción que estabas intentando.

+3

¿Qué significa "la aplicación falla"? ¿Se cuelga en el marco? En tu código? ¿Tienes un callstack? ¿Se lanza una excepción? ¿Cuál es la excepción (y el mensaje)? –

+0

Creo que está fallando en el marco. Lo estoy ejecutando a través del depurador de Visual Studio, pero aparece una ventana separada de "Depurador Just-In-Time de Visual Studio" con el mensaje "Se produjo una excepción Win32 no controlada en App.exe [2596]". Aparece un cuadro de advertencia sobre el que dice "Un depurador está conectado a App.exe pero no está configurado para depurar esta excepción no controlada. Para depurar esta excepción, desconecte el depurador actual". – jokeefe

+0

Creo que necesitamos más contexto para detectar el problema. ¿Puedes publicar tu AppBar xaml? – mydogisbox

Respuesta

8

He estado jugando con esto por un tiempo (usando tanto IsEnabled, como estableciendo la propiedad Visibilidad en Visibility.Collapsed), y la única forma en que pude deshabilitar exitosamente la AppBar sin levantar la excepción fue mostrar el AppBar primero. Una vez que se ha mostrado AppBar, estableciendo IsEnabled en falso, o estableciendo Visibilidad en Visibilidad. Collapsed ya no arroja la excepción.

Sin embargo, si crea la AppBar mediante programación, así:

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; 

pero no lo agregue a Page.BottomAppBar hasta la primera vez que lo necesite, no obtendrá la excepción.

He probado el uso de un botón con el siguiente controlador:

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

Cuando la aplicación carga la primera vez, si se intenta invocar la AppBar, no pasa nada. Haga clic en el botón (que agrega AppBar a Page.BottomAppBar) e invocar AppBar mostrará AppBar. Vuelva a hacer clic en el botón y ya no se mostrará AppBar (aunque myAppBar todavía está instanciado y listo cuando lo necesita de nuevo).

Espero que ayude!

+1

Esto funciona perfectamente. ¡Gracias! Descubrí que es mejor usar 'this.BottomAppBar = null' para deshabilitarlo en lugar de establecer las propiedades' IsEnabled' o 'Visibility'. Si acaba de establecer 'Visibilidad' en' Contraído', cuando hace clic derecho, la aplicación aún piensa que hay una AppBar presente aunque no esté visible, por lo que su siguiente clic regular se interpretará como el clic que normalmente desactiva la AppBar, por lo que tendrá que hacer clic por segunda vez para llevar a cabo la acción que estaba intentando. ¡Gracias de nuevo por la ayuda! – jokeefe

+0

Mi placer. Me alegro de poder ayudar. – devhammer

+0

Se produce un error al intentar cargar un objeto de recurso de la barra de herramientas definido en un archivo xaml. Sin embargo, tuve éxito con el uso del código puro sin ningún recurso xaml. –

2

Puede utilizar CustomAppBar desde WinRT XAML Toolkit. Se puede deshabilitar de múltiples maneras: puede enlazar sus propiedades CanOpen o CanDismiss para bloquear su aparición o desaparición, que podría ser lo que usted desea.

+1

Por supuesto que sí. Quería que la barra de aplicaciones funcionara o no, según las condiciones, y CustomAppBar proporciona eso y no falla. Lo creé precisamente debido a las limitaciones/problemas con el AppBar nativo. –

+0

Muchas gracias por su sugerencia, @Filip Skakun. Si no fuera capaz de obtener la solución G. Andrew Duthie, devhammer proporcionado para trabajar, definitivamente me habría ido por esta ruta. Volveré a verificar con su biblioteca la próxima vez que encuentre un problema como este. – jokeefe

4

Si aún desea definir su AppBar en XAML, puede cerrar programáticamente AppBar en el código subyacente.En XAML, crear el AppBar inferior:

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

Luego, en el código C# atrás:

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

Vas a tener que poner en práctica su propia verificación para "CanAppBarOpen()"

+0

Funciona perfectamente, gracias – Lufi

2

Usted puede hacer como esto por la manipulación abierto caso de AppBar

En XAML:

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

En C# Código:

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

1. Añadir un evento de cambio de selección para el control de flipview en el archivo XAML:

<FlipView SelectionChanged="MyFlipView_SelectionChanged" /> 

2. Añadir esta miembro de la clase variable a su archivo xaml de código subyacente:

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

3. Implementar la selección de la FlipView cambió manejador aquí:

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

    BuildPageAppBarDictionary(); 

    InitializeAppBar(flipView); 
    NullOtherAppBars(flipView); 
} 
  1. Añadir estos métodos:

    BuildPageAppBarDictionary private void() { _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); 
    } 
    

    }

    privada vacío InitializeAppBar (FlipView flipView) { si (_appbarDictionary.Count> 0) { var = currentPage flipView.SelectedItem como página; 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 artículo en MyFlipView.Items) { si (artículo! = FlipView.SelectedItem) { página var = item como Page;

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

Por favor, perdona los problemas de formato fragmento. Intenté hacer el formato de ejemplo en esta página lo mejor que pude.

+0

lista de mezclas, las viñetas y el código no funcionan bien (tuve el mismo problema al comenzar a publicar aquí :-) – kleopatra

Cuestiones relacionadas