2009-03-09 6 views
2

J'ai une zone de texte empilée au-dessus d'un ComboBox. Le TextBox devient plus grand (via l'animation) quand il obtient le focus, et rétrécit vers le bas quand il perd le focus.Comment empêcher un popup WPF combobox de se détacher lorsque la combobox est en mouvement?

Les problèmes commencent lorsque la zone de texte perd le focus sur la zone de liste déroulante. Lorsque cela se produit, le Popup de sélection (la partie qui "descend") apparaît juste en dessous de la ComboBox, comme prévu, mais comme ComboBox commence à se déplacer vers le haut (puisque le TextBox ci-dessus rétrécit), le Popup de sélection ne suit pas, et apparaît maintenant détaché du ComboBox. Probablement parce que la fenêtre contextuelle de sélection (comme tous les fenêtres contextuelles) ne fait pas partie de la même arborescence visuelle que la zone de texte et la zone de liste déroulante, sa mise en page n'est pas recalculée au fur et à mesure de l'animation.

Comment puis-je conserver mon ComboBox entier? Ci-dessous, un extrait que vous pouvez coller dans XamlPad pour le reproduire. Toute aide est très appréciée!

<Page xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:sys="clr-namespace:System;assembly=mscorlib" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" > 
    <StackPanel Width="100" Orientation="Vertical"> 
    <TextBox Height="19"> 
     <TextBox.Triggers> 
     <EventTrigger RoutedEvent="UIElement.GotFocus"> 
      <EventTrigger.Actions> 
      <BeginStoryboard> 
       <Storyboard TargetProperty="Height"> 
       <DoubleAnimation From="19" To="100" Duration="0:0:0.2"/> 
       </Storyboard> 
      </BeginStoryboard> 
      </EventTrigger.Actions> 
     </EventTrigger> 
     <EventTrigger RoutedEvent="UIElement.LostFocus"> 
      <EventTrigger.Actions> 
      <BeginStoryboard> 
       <Storyboard TargetProperty="Height"> 
       <DoubleAnimation From="100" To="19" Duration="0:0:0.2"/> 
       </Storyboard> 
      </BeginStoryboard> 
      </EventTrigger.Actions> 
     </EventTrigger> 
     </TextBox.Triggers> 
    </TextBox> 
    <ComboBox> 
     <ComboBoxItem>Item 1</ComboBoxItem> 
     <ComboBoxItem>Item 2</ComboBoxItem> 
    </ComboBox> 
    </StackPanel> 
</Page> 

Cela a également été affiché comme un bug au site Microsoft Connect:

https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=422254

Répondre

0

Je ne sais pas qu'il ya une solution ici. Cependant, je classerais cela comme un bogue et le classerais sur le site Microsoft Connect.

+0

disgnostic https://connect.microsoft.com/VisualStudio/ feedback/ViewFeedback.aspx? FeedbackID = 422254 – nollidge

0

Ceci est une solution extrêmement boiteux, mais vous pouvez faire Popup ouverte relative du ComboBox à la zone de texte au lieu de la zone de liste déroulante:

<Page xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:sys="clr-namespace:System;assembly=mscorlib" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
    <StackPanel Width="100" Orientation="Vertical"> 
     <TextBox x:Name="myTextBox" Height="19"> 
      <TextBox.Triggers> 
       <EventTrigger RoutedEvent="UIElement.GotFocus"> 
        <EventTrigger.Actions> 
         <BeginStoryboard> 
          <Storyboard TargetProperty="Height"> 
           <DoubleAnimation Duration="0:0:0.2" From="19" To="100"/> 
          </Storyboard> 
         </BeginStoryboard> 
        </EventTrigger.Actions> 
       </EventTrigger> 
       <EventTrigger RoutedEvent="UIElement.LostFocus"> 
        <EventTrigger.Actions> 
         <BeginStoryboard> 
          <Storyboard TargetProperty="Height"> 
           <DoubleAnimation Duration="0:0:0.2" From="100" To="19"/> 
          </Storyboard> 
         </BeginStoryboard> 
        </EventTrigger.Actions> 
       </EventTrigger> 
      </TextBox.Triggers> 
     </TextBox> 
     <ComboBox> 
      <ComboBox.Resources> 
       <Style TargetType="{x:Type Popup}"> 
        <Setter Property="PlacementTarget" Value="{Binding ElementName=myTextBox}"/> 
        <Setter Property="PlacementRectangle" Value="0,39,0,0"/> 
       </Style> 
      </ComboBox.Resources> 
      <ComboBoxItem>Item 1</ComboBoxItem> 
      <ComboBoxItem>Item 2</ComboBoxItem> 
     </ComboBox> 
    </StackPanel> 
</Page> 
Questions connexes