2009-10-19 5 views
1

J'ai un contrôle WPF Popup avec un ListBox et un bouton dedans. Lorsque je clique sur le Button, il devrait être désactivé. Le problème est que lorsque je désactive le bouton, la touche Tab disparaît du menu contextuel. J'ai essayé de mettre l'accent sur le ListBox, après avoir défini le IsEnabled du bouton sur false, mais cela n'a pas fonctionné. Alors, comment puis-je définir le focus de l'onglet à la ListBox dans le contrôle Popup?WPF Popup tab bug bug

Voici mon code.

Window1.xaml:

<Window x:Class="WpfApplication5.Window1" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="Window1" Height="300" Width="300"> 
    <StackPanel> 
     <Button Name="openButton" Content="Open"/> 
     <Popup Name="popup" Placement="Center"> 
      <StackPanel> 
       <ListBox Name="listBox"/> 
       <Button Name="newItemsButton" Content="New Items"/> 
      </StackPanel> 
     </Popup> 
    </StackPanel> 
</Window> 

Window1.xaml.cs:

using System.Windows; 
using System.Windows.Controls; 
using System.Windows.Input; 

namespace WpfApplication5 
{ 
    partial class Window1 : Window 
    { 
     public Window1() 
     { 
      InitializeComponent(); 
      openButton.Focus(); 
      listBox.ItemsSource = new string[] { "Item1", "Item2", "Item3" }; 
      listBox.SelectedIndex = 1; 

      openButton.Click += delegate { popup.IsOpen = true; }; 
      popup.Opened += delegate { FocusListBox(); }; 
      newItemsButton.Click += delegate 
      { 
       newItemsButton.IsEnabled = false; 
       FocusListBox(); 
      }; 
     } 

     void FocusListBox() 
     { 
      var i = listBox.ItemContainerGenerator.ContainerFromIndex(
       listBox.SelectedIndex) as ListBoxItem; 
      if (i != null) 
       Keyboard.Focus(i); 
     } 
    } 
} 

Et voici une capture d'écran:

alt text http://img11.imageshack.us/img11/6305/popuptabkey.png

plus tard Edit:

J'ai trouvé une solution de contournement, qui est de retarder l'appel FocusListBox(); comme ci-dessous:

Dispatcher.BeginInvoke(new Action(FocusListBox), DispatcherPriority.Input); 

Répondre

2

Vous devez définir un champ de mise au point explicite en définissant le FocusManager.IsFocusScope property sur le Popup:

<Popup FocusManager.IsFocusScope="true"> 
    <!-- your content here --> 
</Popup> 

Cela empêchera le focus de revenir aux contrôles de l'élément conteneur.

+0

KeyboardNavigation.TabNavigation = "Cycle" ne fait rien. –

+0

Désolé, vous avez raison, il s'agit de la portée de mise au point. Testé, ça marche, révisé ma réponse. –

+1

FYI, quand je l'ai testé, j'avais laissé votre code-behind exactement comme vous l'avez fourni (avec l'appel explicite à Focus the list box). Réalisant cela, je suis retourné et l'ai enlevé et la mise au point saute toujours hors du Popup qui est très étrange. Pour le moment, cela vous évitera de devoir utiliser une minuterie pour retarder la mise au point. –