Compartir a través de


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

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 varias partes 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, el control debe haber registrado previamente mediante el método UIElement.RegisterAsScrollPort . El marco de trabajo 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 sub elementos que escuchan la ventanilla efectiva debe recibir una notificación de los cambios.

EffectiveViewport se da 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, este ...

<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 traído 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. Es posible que los controles que realizan la virtualización necesiten 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 tartamudes, 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 occluyendo 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 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 se establece en Collapsed, este evento no se generará.
  • Aunque la ventanilla eficaz tiene en cuenta las transformaciones de representación para todos los antecesores de elementos, no tiene en cuenta los efectos del recorte (aparte del clip del elemento registrado por un control de desplazamiento como 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