FrameworkElement.EffectiveViewportChanged Evento

Definición

Se produce cuando cambia la ventanilla efectiva de 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) 

Tipo de evento

Requisitos de Windows

Familia de dispositivos
Windows 10, version 1809 (se introdujo en la versión 10.0.17763.0)
API contract
Windows.Foundation.UniversalApiContract (se introdujo en la versión v7.0)

Comentarios

Un control de desplazamiento permite al usuario desplazarse por el contenido que ocupa más espacio de lo que está disponible en la interfaz de usuario. La parte del contenido que ve el usuario se denomina ventanilla.

El evento EffectiveViewportChanged proporciona varios fragmentos de información:

  1. EffectiveViewport real
  2. Cálculo de MaxViewport
  3. Valores escalares para BringIntoViewDistanceX y BringIntoViewDistanceY

EffectiveViewport

EffectiveViewport es la intersección de todas las ventanillas conocidas que contienen FrameworkElement en su subárbol. Si hay dos o más ventanillas (por ejemplo, un ScrollViewer anidado dentro de otro ScrollViewer) que no se superponen, EffectiveViewport es un Rect vacío.

Nota

Para que se conozca la ventanilla de un control de desplazamiento en el marco de trabajo, el control debe haberse registrado previamente mediante el método UIElement.RegisterAsScrollPort . El marco usa el Clip del elemento registrado al determinar la ventanilla efectiva.

Cuando cambia la ventanilla del control de desplazamiento, debe invocar su método InvalidateViewport para informar al marco de trabajo de que su ventanilla ha cambiado y que cualquiera de sus subelementos que escuchan la ventanilla efectiva deben recibir notificaciones de los cambios.

EffectiveViewport se asigna en el espacio de coordenadas de FrameworkElement. No es necesario realizar un objeto TransformToVisual con la ventanilla Rect.

En un escenario sencillo en el que hay un ScrollViewer que contiene un solo elemento, el evento EffectiveViewportChanged proporciona actualizaciones de ventanilla similares al evento ViewChanged . La principal diferencia es que el evento EffectiveViewportChanged se genera después del paso de organización del diseño.

Por ejemplo, esto ...

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

... proporciona información de ventanilla similar a esta...

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

MaxViewport

MaxViewport es similar a EffectiveViewport, pero en lugar de representar una intersección simple de las ventanillas conocidas, representa la intersección de las ventanillas como si cada una se hubiera incorporado a la vista de cualquier ventanilla externa. El rect resultante representa dos cosas:

  1. el tamaño más grande que puede tener EffectiveViewport (dados los tamaños de ventanilla actuales) y
  2. posición de la ventanilla máxima efectiva en relación con FrameworkElement.

Esta información se puede usar para medir dónde y cuánto contenido debe generar previamente FrameworkElement para rellenar potencialmente la ventanilla antes de desplazarse a la vista.

Nota

El sistema controla el desplazamiento a través de entradas directas, como la entrada táctil o el lápiz, en un proceso independiente. De forma predeterminada, el desplazamiento se controla de forma asincrónica en el subproceso de la interfaz de usuario. Los controles que realizan la virtualización pueden necesitar generar previamente el contenido antes de entrar en la ventanilla debido al costo inherente de la creación de elementos.

Retrasar toda la preparación del contenido hasta que llegue a la vista puede dar lugar a una mala experiencia de desplazamiento para los usuarios. Los usuarios pueden ver espacio en blanco o tartamudeos, ambos síntomas del subproceso de la interfaz de usuario no pueden mantenerse al día con la velocidad de movimiento panorámico.

La posición de MaxViewport se notifica en el espacio de coordenadas de FrameworkElement. Si maxViewport se transformó en el espacio de coordenadas de la primera ventanilla de la cadena de antecesores de FrameworkElement, el rect estaría dentro de los límites de esa primera ventanilla.

BringIntoViewDistanceX e Y

Estos valores indican la proximidad de FrameworkElement para que sea máximamente visible en todas sus ventanillas.

Si el valor es mayor que cero, pero menor que ActualWidth / ActualHeight , el elemento se encuentra parcialmente dentro de la ventanilla visible para el usuario. Cuando los valores son cero, FrameworkElement está completamente dentro de la ventanilla visible para el usuario.

Sugerencia

Esto no garantiza que el elemento sea visible para el usuario, ya que es posible que otros elementos con un orden Z superior sigan ocluyendo frameworkElement.

Dicho más formalmente, estos valores son la suma de la distancia absoluta que el FrameworkElement se traduciría al satisfacer una llamada a StartBringIntoView. Los valores no tienen en cuenta la posibilidad de que un control de desplazamiento tenga deshabilitado el desplazamiento.

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

Comportamiento

  • Si la ventanilla efectiva de un elemento primario y secundario cambian, el elemento primario recibirá la notificación antes del elemento secundario.
  • El evento solo se genera para los elementos del árbol de la interfaz de usuario que participan en el diseño. Por ejemplo, si el elemento no está en el árbol activo o si la propiedad Visibility del elemento o cualquiera de sus antecesores está establecida en Collapsed, este evento no se generará.
  • Aunque la ventanilla efectiva tiene en cuenta las transformaciones de representación de todos los elementos antecesores, no tiene en cuenta los efectos del recorte (excepto el clip del elemento registrado por un control de desplazamiento como su ventanilla).
  • La ventanilla efectiva no tiene en cuenta la oclusión debido a que otros elementos tienen un orden Z superior.

Se aplica a

Consulte también