FrameworkElement.EffectiveViewportChanged Событие

Определение

Происходит при изменении эффективного окна просмотраFrameworkElement.

// Register
event_token EffectiveViewportChanged(TypedEventHandler<FrameworkElement, EffectiveViewportChangedEventArgs const&> const& handler) const;

// Revoke with event_token
void EffectiveViewportChanged(event_token const* cookie) const;

// Revoke with event_revoker
FrameworkElement::EffectiveViewportChanged_revoker EffectiveViewportChanged(auto_revoke_t, TypedEventHandler<FrameworkElement, EffectiveViewportChangedEventArgs const&> const& handler) const;
public event TypedEventHandler<FrameworkElement,EffectiveViewportChangedEventArgs> EffectiveViewportChanged;
function onEffectiveViewportChanged(eventArgs) { /* Your code */ }
frameworkElement.addEventListener("effectiveviewportchanged", onEffectiveViewportChanged);
frameworkElement.removeEventListener("effectiveviewportchanged", onEffectiveViewportChanged);
- or -
frameworkElement.oneffectiveviewportchanged = onEffectiveViewportChanged;
Public Custom Event EffectiveViewportChanged As TypedEventHandler(Of FrameworkElement, EffectiveViewportChangedEventArgs) 

Тип события

Комментарии

Элемент управления прокруткой позволяет пользователю сдвигать или прокручивать содержимое, которое занимает больше места, чем доступно в пользовательском интерфейсе. Часть содержимого, которое видит пользователь, называется окном просмотра.

Событие EffectiveViewportChanged предоставляет несколько фрагментов информации:

  1. Фактическая функция EffectiveViewport
  2. Вычисление для MaxViewport
  3. Скалярные значения для Объекта BringIntoViewDistanceX и BringIntoViewDistanceY

EffectiveViewport

EffectiveViewport — это пересечение всех известных представлений, содержащих FrameworkElement в их поддереве. Если есть два или более портов просмотра (например, ScrollViewer, вложенный внутри другого ScrollViewer ), которые не перекрываются, То EffectiveViewport является пустым прямоугольником.

Note

Для просмотра элемента управления прокрутки, известного платформе, элемент управления должен ранее зарегистрировать его с помощью метода UIElement.RegisterAsScrollPort . Платформа использует клип зарегистрированного элемента при определении эффективного окна просмотра.

При изменении окна просмотра элемента управления прокрутки необходимо вызвать его метод InvalidateViewport , чтобы сообщить платформе, что его окно просмотра изменилось, и любой из его вложенных элементов, которые прослушивают эффективный порт просмотра, должны быть уведомлены об изменениях.

Функция EffectiveViewport предоставляется в пространстве координат FrameworkElement. Нет необходимости выполнять преобразованиеToVisual с прямоугольникой представления.

В простом сценарии, где есть ScrollViewer , содержащий один элемент, событие EffectiveViewportChanged предоставляет обновления окна просмотра, аналогичные событию ViewChanged . Основное различие заключается в том, что событие EffectiveViewportChanged возникает после прохождения макета.

Например, это ...

<ScrollViewer>
    <Grid Height="4000" Width="4000"
          EffectiveViewportChanged="Grid_EffectiveViewportChanged"/>
</ScrollViewer>

... предоставляет аналогичные сведения о порте просмотра, как это...

<ScrollViewer ViewChanged="ScrollViewer_ViewChanged">
    <Grid Height="4000" Width="4000"/>
</ScrollViewer>

MaxViewport

MaxViewport похож на EffectiveViewport, но вместо того, чтобы представлять простое пересечение известных портов просмотра, он представляет пересечение портов просмотра, как если бы каждое из них было передано в представление любого внешнего окна просмотра. Результирующий прямоугольник представляет две вещи:

  1. самый большой размер, который может быть в EffectiveViewport (учитывая текущие размеры окна просмотра) и
  2. положение максимального эффективного окна просмотра относительно FrameworkElement.

Эти сведения можно использовать для оценки того, где и сколько содержимого FrameworkElement должно предварительно создать, чтобы потенциально заполнить окно просмотра перед прокруткой в представление.

Note

Прокрутка с помощью прямых входных данных, таких как касание или перо, обрабатывается системой в отдельном процессе. По умолчанию прокрутка обрабатывается асинхронно в поток пользовательского интерфейса. Элементы управления, выполняющие виртуализацию, могут потребоваться заранее создать содержимое заранее перед вводом окна просмотра из-за присущей стоимости создания элемента.

Задержка всей подготовки содержимого до появления в представлении может привести к плохому прокручиваемой прокрутке для пользователей. Пользователи могут видеть пустое место или заикание, оба симптома потока пользовательского интерфейса не могут следить за скоростью сдвига.

Позиция MaxViewport сообщается в пространстве координат FrameworkElement. Если MaxViewport были преобразованы в координатное пространство первого окна просмотра в цепочке предков FrameworkElement, rect будет находиться в пределах этого первого окна просмотра.

BringIntoViewDistanceX и Y

Эти значения указывают, насколько близкоFrameworkElement становится максимально видимым во всех его окнах просмотра.

Если значение больше нуля, но меньше, чем ActualWidth / ActualHeight , элемент частично находится в пользовательском представлении. Если значения равны нулю, FrameworkElement полностью находится в пользовательском представлении.

Tip

Это не гарантирует, что элемент отображается пользователю, так как другие элементы с более высоким порядком Z по-прежнему могут быть occluding FrameworkElement.

Более формально эти значения являются суммой абсолютного расстояния, которое FrameworkElement будет переведено при выполнении вызова StartBringIntoView. Значения не учитывают возможность отключения элемента управления прокруткой.

<ListView x:Name="lv">
    <ListView.ItemTemplate>
        <DataTemplate x:DataType="x:String">
            <UserControl Tag="{x:Bind}"
                         EffectiveViewportChanged="Item_EffectiveViewportChanged"/>
        </DataTemplate>
    </ListView.ItemTemplate>
</ListView>
private void Item_EffectiveViewportChanged(FrameworkElement sender, EffectiveViewportChangedEventArgs args)
{
    // If we wanted to know if a list item (w/ vertical scrolling only) is partially within the viewport
    // then we can just check the BringIntoViewDistanceY of the event args.  If the distance is 0 then the item is fully within
    // the effective viewport.  If the BringIntoViewDistanceY is less than the sender's ActualHeight, then its
    // partially within the effective viewport.
    // The EffectiveViewport rect is relative to the sender, so we can use it to know where the element is within the viewport.  
    // NOTE: "Within the viewport" != visible to the user's eye, since another element may overlap and obscure it.
    if (args.BringIntoViewDistanceY < sender.ActualHeight)
    {
        Debug.WriteLine($"Item: {sender.Tag} has {sender.ActualHeight - args.BringIntoViewDistanceY} pixels within the viewport");
    }
    else
    {
        Debug.WriteLine($"Item: {sender.Tag} has {args.BringIntoViewDistanceY - sender.ActualHeight} pixels to go before it is even partially visible");
    }

    // Consider disconnecting from the effective viewport when not needed.  Otherwise, it is called on every viewport change.
    //lv.EffectiveViewportChanged -= Item_EffectiveViewportChanged;
}

Behavior

  • Если действующее окно просмотра родительского и дочернего элементов изменится, родитель получит уведомление перед дочерним элементом.
  • Событие создается только для элементов в дереве пользовательского интерфейса, участвующих в макете. Например, если элемент не находится в динамическом дереве, или если свойству Видимости элемента или любому из его предков присвоено значение Collapsed, это событие не будет создано.
  • Хотя эффективный порт просмотра учитывает преобразования отрисовки для всех предков элементов, он не учитывает эффекты вырезки (кроме клипа элемента, зарегистрированного элементом управления прокрутки в качестве окна просмотра).
  • Эффективный порт просмотра не учитывает окклюзию из-за других элементов, имеющих более высокий порядок Z.

Применяется к

См. также раздел