Как предотвратить всплывающее окно со списком WPF при его перемещении? - PullRequest
2 голосов
/ 09 марта 2009

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

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

Предположительно, это связано с тем, что всплывающее окно выбора (как и все всплывающие окна) не является частью того же визуального дерева, что и 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

Ответы [ 2 ]

0 голосов
/ 10 марта 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>
0 голосов
/ 09 марта 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...