Как предотвратить отсоединение всплывающего окна со списком WPF при перемещении поля со списком?

У меня есть текстовое поле, расположенное поверх ComboBox. TextBox становится выше (с помощью анимации), когда получает фокус, и сжимается, когда теряет фокус.

Проблемы начинаются, когда TextBox теряет фокус в ComboBox. Когда это происходит, всплывающее окно выбора (часть, которая «опускается») появляется чуть ниже ComboBox, как и ожидалось, но когда ComboBox начинает двигаться вверх (поскольку текстовое поле выше теперь сжимается), всплывающее окно выбора не следует за ним, и теперь кажется отделенным от ComboBox.

Предположительно это связано с тем, что выбранный элемент Popup (как и все Popups) не является частью того же визуального дерева, что и TextBox и ComboBox, поэтому его макет не пересчитывается в процессе анимации.

Как сохранить целостность ComboBox?

Ниже приведен фрагмент, который вы можете вставить в XamlPad, чтобы воспроизвести это. Любая помощь высоко ценится!

<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>

Это также было опубликовано как ошибка на сайте Microsoft Connect:

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


person nollidge    schedule 09.03.2009    source источник


Ответы (2)


Я не знаю, есть ли здесь обходной путь. Однако я бы категорически классифицировал это как ошибку и зарегистрировал на сайте Microsoft Connect.

person casperOne    schedule 09.03.2009
comment
Готово: connect.microsoft.com/VisualStudio/feedback/ - person nollidge; 10.03.2009

Это крайне неудачный обходной путь, но вы можете сделать всплывающее окно ComboBox открытым относительно TextBox вместо ComboBox:

<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>
person Robert Macnee    schedule 09.03.2009