2015-01-05 11 views
6

Immaginate la seguente semplice pagina markup:App XAML per Windows Phone 8.1. Come prevenire un cambio di messa a fuoco automatico inappropriato?

<Page 
    x:Class="AutoFocusBug.MainPage" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 

    <StackPanel> 
     <!--<Button x:Name="FocusHolder" Width="0" Height="0" MinHeight="0" MinWidth="0"/>--> 
     <TextBox Text="zxczczczczx"/> 
     <Button x:Name="Button1" Content="Button1" Click="ButtonBase_OnClick"/> 
    </StackPanel> 
</Page> 

e il seguente code-behind:

private void ButtonBase_OnClick(object sender, RoutedEventArgs e) 
{ 
    Button1.Visibility = Visibility.Collapsed; 
} 

Quando clicco Button1 pulsante nasconde (che è previsto e desiderato), ma per qualche motivo TextBox automaticamente ottiene la messa a fuoco e appare la tastiera sullo schermo. Non voglio questa messa a fuoco automatica inaspettata.

Posso provare a fare qualcosa a fuoco nel gestore Click ma nell'app reale è implementato con ViewModel con i comandi e così via e sembra un hack sporco (e anche la tastiera appare per un breve periodo anche se cambio fuoco subito dopo pulsante nascosto).

Il secondo approccio che ho trovato è quello di creare il pulsante "invisibile" da qualche parte prima della casella di testo (commentato FocusHolder) che è molto meglio, ma anche non sembra la tecnica corretta.

Quindi, che cos'è? È questo un meccanismo che posso in qualche modo configurare per "reindirizzare" il focus dall'elemento collassato? o è un bug? Qual è il modo giusto per evitare questo auto-focus indesiderato?

risposta

4

Il motivo è dovuto al passaggio dell'indice Tab dal pulsante alla casella di testo. Questa è una cosa molto fastidiosa di WP8.1. Non ho trovato una soluzione "buona" per questo, ma potrebbe essere più pulito della tua attuale soluzione.

XAML

<TextBox x:Name="myTextBox" Text="zxczczczczx"/> 

La funzione

private void ButtonBase_OnClick(object sender, RoutedEventArgs e) 
{ 
    myTextBox.IsTabStop = false; 
    Button1.Visibility = Visibility.Collapsed; 
    myTextBox.IsTabStop = true; 
} 

Buona fortuna.

+0

Grazie per un'altra soluzione. Il pulsante "invisibile" è ancora la soluzione migliore nel mio caso, ma è bene avere più opzioni. Non sembra che ci sia una soluzione corretta, quindi sto chiudendo la domanda. – proman

4

Sono stato in grado di risolvere questo problema impostando TabIndex.

Impostare l'ordine dell'indice per mettere a fuoco il secondo controllo prima del controllo TextBox.

<Page 
x:Class="AutoFocusBug.MainPage" 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 

<StackPanel> 
    <!--<Button x:Name="FocusHolder" Width="0" Height="0" MinHeight="0" MinWidth="0"/>--> 
    <TextBox Text="zxczczczczx" TabIndex="2"/> 
    <Button x:Name="Button1" Content="Button1" Click="ButtonBase_OnClick" TabIndex="1"/> 
</StackPanel> 

0

tenta di impostare TabNavigation = "Cycle" al pulsante. Questo sta funzionando per me.

Problemi correlati