Interoperabilidad de WPF y Win32WPF and Win32 Interoperation

En este tema se proporciona información general sobre cómo interoperar código de WPFWPF y Win32Win32.This topic provides an overview of how to interoperate WPFWPF and Win32Win32 code. Windows Presentation Foundation (WPF)Windows Presentation Foundation (WPF) proporciona un entorno rico para crear aplicaciones.provides a rich environment for creating applications. Pero, si ha hecho una inversión sustancial en código de Win32Win32, podría resultar más efectivo reutilizar parte de ese código.However, when you have a substantial investment in Win32Win32 code, it might be more effective to reuse some of that code.

Conceptos básicos de interoperación de WPF y Win32WPF and Win32 Interoperation Basics

Hay dos técnicas básicas de la interoperación entre el código de WPFWPF y Win32Win32.There are two basic techniques for interoperation between WPFWPF and Win32Win32 code.

  • Hospedar contenido de WPFWPF en una ventana de Win32Win32.Host WPFWPF content in a Win32Win32 window. Con esta técnica puede usar las capacidades gráficas avanzadas de WPFWPF en el marco de una ventana y aplicación estándar de Win32Win32.With this technique, you can use the advanced graphics capabilities of WPFWPF within the framework of a standard Win32Win32 window and application.

  • Hospedar una ventana de Win32Win32 en un contenido de WPFWPF.Host a Win32Win32 window in WPFWPF content. Con esta técnica puede usar un control personalizado de Win32Win32 existente en el contexto de otro contenido de WPFWPF y pasar datos a través de los límites.With this technique, you can use an existing custom Win32Win32 control in the context of other WPFWPF content, and pass data across the boundaries.

Todas estas técnicas se presentan conceptualmente en este tema.Each of these techniques is conceptually introduced in this topic. Para obtener más información orientada al código sobre WPFWPF el Win32Win32hospedaje en , vea Tutorial: Hospedar contenido de WPFen Win32.For a more code-oriented illustration of hosting WPFWPF in Win32Win32, see Walkthrough: Hosting WPF Content in Win32. Para obtener más información orientada al código sobre Win32Win32 el WPFWPFhospedaje en , vea Tutorial: Hospedar un control de Win32en WPF.For a more code-oriented illustration of hosting Win32Win32 in WPFWPF, see Walkthrough: Hosting a Win32 Control in WPF.

Proyectos de interoperación de WPFWPF Interoperation Projects

WPFWPFLas API son código administrado, pero la Win32Win32 mayoría de los programas existentes están escritos C++en no administrado.APIs are managed code, but most existing Win32Win32 programs are written in unmanaged C++. No se puede WPFWPF llamar a las API desde un auténtico programa no administrado.You cannot call WPFWPF APIs from a true unmanaged program. Sin embargo, si se /clr usa la opción Microsoft Visual C++Microsoft Visual C++ con el compilador, se puede crear un programa mixto administrado-no administrado en el que se puedan combinar sin problemas llamadas API administradas y no administradas.However, by using the /clr option with the Microsoft Visual C++Microsoft Visual C++ compiler, you can create a mixed managed-unmanaged program where you can seamlessly mix managed and unmanaged API calls.

Una complicación de nivel de proyecto es que no Lenguaje XAML (Extensible Application Markup Language)Extensible Application Markup Language (XAML) se pueden compilar archivos en un C++ proyecto.One project-level complication is that you cannot compile Lenguaje XAML (Extensible Application Markup Language)Extensible Application Markup Language (XAML) files into a C++ project. Existen varias técnicas de división de proyectos para compensarlo.There are several project division techniques to compensate for this.

  • Cree un C# archivo DLL que contenga XAMLXAML todas las páginas como un ensamblado compilado y, C++ después, haga que el archivo ejecutable incluya ese archivo dll como referencia.Create a C# DLL that contains all your XAMLXAML pages as a compiled assembly, and then have your C++ executable include that DLL as a reference.

  • Cree un C# archivo ejecutable para el WPFWPF contenido y haga referencia a un C++ archivo DLL que contenga Win32Win32 el contenido.Create a C# executable for the WPFWPF content, and have it reference a C++ DLL that contains the Win32Win32 content.

  • Use Load para cargar cualquier XAMLXAML en tiempo de ejecución, en lugar de compilar el XAMLXAML.Use Load to load any XAMLXAML at run time, instead of compiling your XAMLXAML.

  • No use XAMLXAML en absoluto y escriba WPFWPF todo en el código, creando el árbol de elementos a partir de Application.Do not use XAMLXAML at all, and write all your WPFWPF in code, building up the element tree from Application.

Use el método que se adapte mejor a sus necesidades.Use whatever approach works best for you.

Nota

Si no ha usado C++/CLI antes, es posible que observe algunas palabras clave "nuevas" como gcnew y nullptr en los ejemplos de código de interoperación.If you have not used C++/CLI before, you might notice some "new" keywords such as gcnew and nullptr in the interoperation code examples. Estas palabras clave reemplazan la sintaxis de doble subrayado__gcanterior () y proporcionan una sintaxis más natural para el C++código administrado en.These keywords supersede the older double-underscore syntax (__gc) and provide a more natural syntax for managed code in C++. Para obtener más información sobre C++las características administradas de/CLI, vea extensiones de componentes para plataformas en tiempo de ejecución y Hola, C++/CLI.To learn more about the C++/CLI managed features, see Component Extensions for Runtime Platforms and Hello, C++/CLI.

Cómo WPF usa los HWNDHow WPF Uses Hwnds

Para aprovechar al máximo la "interoperación de HWND" de WPFWPF, debe comprender cómo WPFWPF usa los HWND.To make the most of WPFWPF "HWND interop", you need to understand how WPFWPF uses HWNDs. Para cualquier HWND, no se puede WPFWPF mezclar la representación con la representación de DirectX o la representación de GDI/GDI+.For any HWND, you cannot mix WPFWPF rendering with DirectX rendering or GDI / GDI+ rendering. Esto tiene varias implicaciones.This has a number of implications. En primer lugar, para poder mezclar estos modelos de representación, debe crear una solución de interoperación y usar segmentos de interoperación designados para cada modelo de representación que quiera usar.Primarily, in order to mix these rendering models at all, you must create an interoperation solution, and use designated segments of interoperation for each rendering model that you choose to use. Además, el comportamiento de representación crea una restricción de "espacio aéreo" de lo que puede llevar a cabo su solución de interoperación.Also, the rendering behavior creates an "airspace" restriction for what your interoperation solution can accomplish. El concepto "espacio aéreo" se describe más detalladamente en el tema Información general sobre áreas de la tecnología.The "airspace" concept is explained in greater detail in the topic Technology Regions Overview.

Todos los elementos de WPFWPF de la pantalla están respaldados en última instancia por un HWND.All WPFWPF elements on the screen are ultimately backed by a HWND. WPFWPF Al crear un Window, HwndSource WPFWPFcreaunHWNDde nivel superior y utiliza para colocar ysucontenidodentrodelHWND.Window WPFWPFWhen you create a WPFWPF Window, WPFWPF creates a top-level HWND, and uses an HwndSource to put the Window and its WPFWPF content inside the HWND. El resto del contenido de WPFWPF de la aplicación comparte ese HWND en concreto.The rest of your WPFWPF content in the application shares that singular HWND. Una excepción son los menús, los menús desplegables de cuadro combinado y otros elementos emergentes.An exception is menus, combo box drop downs, and other pop-ups. Estos elementos crean su propia ventana de nivel superior, razón por la cual un menú de WPFWPF puede exceder el borde del HWND de ventana que lo contiene.These elements create their own top-level window, which is why a WPFWPF menu can potentially go past the edge of the window HWND that contains it. Cuando se usa HwndHost para colocar un HWND dentro WPFWPFde WPFWPF , informa Win32Win32 a cómo colocar el nuevo HWND secundario en relación con el WPFWPF Window HWND.When you use HwndHost to put an HWND inside WPFWPF, WPFWPF informs Win32Win32 how to position the new child HWND relative to the WPFWPF Window HWND.

Un concepto relacionado con HWND es la transparencia dentro de cada HWND y entre cada uno de ellos.A related concept to HWND is transparency within and between each HWND. Esto también se describe en el tema Información general sobre áreas de la tecnología.This is also discussed in the topic Technology Regions Overview.

Hospedar contenido de WPF en una ventana de Microsoft Win32Hosting WPF Content in a Microsoft Win32 Window

La clave para hospedar WPFWPF un en Win32Win32 una ventana de HwndSource es la clase.The key to hosting a WPFWPF on a Win32Win32 window is the HwndSource class. Esta clase encapsula el contenido de WPFWPF en una ventana de Win32Win32, de manera que el contenido de WPFWPF se puede incorporar en su interfaz de usuario (UI)user interface (UI) como una ventana secundaria.This class wraps the WPFWPF content in a Win32Win32 window, so that the WPFWPF content can be incorporated into your interfaz de usuario (UI)user interface (UI) as a child window. El siguiente enfoque combina Win32Win32 y WPFWPF en una única aplicación.The following approach combines the Win32Win32 and WPFWPF in a single application.

  1. Implemente su contenido de WPFWPF (el elemento raíz del contenido) como una clase administrada.Implement your WPFWPF content (the content root element) as a managed class. Normalmente, la clase hereda de una de las clases que pueden contener varios elementos secundarios o usarse como un elemento raíz, DockPanel como o. PageTypically, the class inherits from one of the classes that can contain multiple child elements and/or used as a root element, such as DockPanel or Page. En los siguientes pasos se hace referencia a esta clase como "clase de contenido de WPFWPF", mientras que las instancias de la clase se denominan "objetos de contenido de WPFWPF".In subsequent steps, this class is referred to as the WPFWPF content class, and instances of the class are referred to as WPFWPF content objects.

  2. Implementar una aplicación de Windows C++con/CLI.Implement a Windows application with C++/CLI. Si está empezando con una C++ aplicación no administrada existente, normalmente puede habilitarla para llamar a código administrado cambiando la configuración del proyecto para incluir la /clr marca del compilador (el ámbito completo de lo que podría ser necesario admitir /clr ). la compilación no se describe en este tema).If you are starting with an existing unmanaged C++ application, you can usually enable it to call managed code by changing your project settings to include the /clr compiler flag (the full scope of what might be necessary to support /clr compilation is not described in this topic).

  3. Establezca el modelo de subprocesos en Contenedor uniproceso (STA).Set the threading model to Single Threaded Apartment (STA). WPFWPF usa este modelo de subprocesamiento.uses this threading model.

  4. Controle la notificación WM_CREATE en el procedimiento de ventana.Handle the WM_CREATE notification in your window procedure.

  5. En el controlador (o en una función a la que llama el controlador), haga lo siguiente:Within the handler (or a function that the handler calls), do the following:

    1. Cree un nuevo HwndSource objeto con el HWND de la ventana primaria parent como su parámetro.Create a new HwndSource object with the parent window HWND as its parent parameter.

    2. Cree una instancia de su clase de contenido WPFWPF.Create an instance of your WPFWPF content class.

    3. Asigne una referencia al WPFWPF objeto de contenido a la HwndSource propiedad de objeto. RootVisualAssign a reference to the WPFWPF content object to the HwndSource object RootVisual property.

    4. La HwndSource propiedad Handle de objeto contiene el identificador de ventana (HWND).The HwndSource object Handle property contains the window handle (HWND). Para obtener un HWND que se pueda usar en la parte de la aplicación no administrada, convierta Handle.ToPointer() en un HWND.To get an HWND that you can use in the unmanaged part of your application, cast Handle.ToPointer() to an HWND.

  6. Implemente una clase administrada que contenga un campo estático para contener una referencia al objeto de contenido de WPFWPF.Implement a managed class that contains a static field that holds a reference to your WPFWPF content object. Esta clase le permite obtener una referencia al WPFWPF objeto de contenido desde el Win32Win32 código, pero lo más importante es que impide que HwndSource se recopile involuntariamente el elemento no utilizado.This class allows you to get a reference to the WPFWPF content object from your Win32Win32 code, but more importantly it prevents your HwndSource from being inadvertently garbage collected.

  7. Adjunte un identificador a uno o varios de los eventos del objeto de contenido de WPFWPF para recibir notificaciones del objeto de contenido WPFWPF.Receive notifications from the WPFWPF content object by attaching a handler to one or more of the WPFWPF content object events.

  8. Comuníquese con el objeto de contenido de WPFWPF mediante la referencia que almacenó en el campo estático para establecer propiedades, llamar a métodos, etc.Communicate with the WPFWPF content object by using the reference that you stored in the static field to set properties, call methods, etc.

Nota

Puede hacer una parte o toda la definición de clase de contenido de WPFWPF para el primer paso en XAMLXAML usando la clase parcial predeterminada de la clase de contenido. Para ello, debe crear un ensamblado independiente y hacer referencia a este.You can do some or all of the WPFWPF content class definition for Step One in XAMLXAML using the default partial class of the content class, if you produce a separate assembly and then reference it. Aunque Application normalmente incluye un objeto como parte de la XAMLXAML compilación en un ensamblado, Application no termina de usarlo como parte de la interoperación, solo se usan una o varias de las clases raíz para los archivos a XAMLXAML los que se hace referencia. a por la aplicación y hacen referencia a sus clases parciales.Although you typically include an Application object as part of compiling the XAMLXAML into an assembly, you do not end up using that Application as part of the interoperation, you just use one or more of the root classes for XAMLXAML files referred to by the application and reference their partial classes. El resto del procedimiento es muy similar al descrito anteriormente.The remainder of the procedure is essentially similar to that outlined above.

Cada uno de estos pasos se muestra en el código del tema Tutorial: Hospedar contenido de WPFen Win32.Each of these steps is illustrated through code in the topic Walkthrough: Hosting WPF Content in Win32.

Hospedar una ventana de Microsoft Win32 en WPFHosting a Microsoft Win32 Window in WPF

La clave para hospedar Win32Win32 una ventana dentro WPFWPF de otro contenido HwndHost es la clase.The key to hosting a Win32Win32 window within other WPFWPF content is the HwndHost class. Esta clase encapsula la ventana en un elemento de WPFWPF que se puede agregar a un árbol de elementos de WPFWPF.This class wraps the window in a WPFWPF element which can be added to a WPFWPF element tree. HwndHosttambién admite las API que le permiten realizar tareas como procesar mensajes para la ventana hospedada.HwndHost also supports APIs that allow you to do such tasks as process messages for the hosted window. El procedimiento básico es el siguiente:The basic procedure is:

  1. Cree un árbol de elementos para una aplicación de WPFWPF (se puede efectuar mediante código o mediante marcado).Create an element tree for a WPFWPF application (can be through code or markup). Busque un punto adecuado y permisible en el árbol de elementos donde HwndHost la implementación se puede agregar como elemento secundario.Find an appropriate and permissible point in the element tree where the HwndHost implementation can be added as a child element. En el resto de estos pasos, este elemento se conoce como el "elemento de reserva".In the remainder of these steps, this element is referred to as the reserving element.

  2. Derive de HwndHost para crear un objeto que contenga Win32Win32 el contenido.Derive from HwndHost to create an object that holds your Win32Win32 content.

  3. En esa clase de host, invalide el HwndHost método. BuildWindowCoreIn that host class, override the HwndHost method BuildWindowCore. Devuelva el HWND de la ventana hospedada.Return the HWND of the hosted window. Tal vez quiera encapsular los controles reales como una ventana secundaria de la ventana devuelta; el encapsulamiento de los controles en una ventana host es una manera sencilla que tiene el contenido de WPFWPF para recibir notificaciones de los controles.You might want to wrap the actual control(s) as a child window of the returned window; wrapping the controls in a host window provides a simple way for your WPFWPF content to receive notifications from the controls. Esta técnica ayuda a corregir algunos problemas de Win32Win32 relacionados con el control de los mensajes en el límite del control hospedado.This technique helps correct for some Win32Win32 issues regarding message handling at the hosted control boundary.

  4. Invalide HwndHost los WndProcmétodos DestroyWindowCore y.Override the HwndHost methods DestroyWindowCore and WndProc. Aquí, la intención es procesar una limpieza y quitar las referencias al contenido hospedado, sobre todo si creó referencias a objetos no administrados.The intention here is to process cleanup and remove references to the hosted content, particularly if you created references to unmanaged objects.

  5. En el archivo de código subyacente, cree una instancia del control que hospeda la clase y conviértalo en un elemento secundario del elemento de reserva.In your code-behind file, create an instance of the control hosting class and make it a child of the reserving element. Normalmente se usaría un controlador de eventos como Loaded, o se utilizaría el constructor de clase parcial.Typically you would use an event handler such as Loaded, or use the partial class constructor. pero también podría agregar el contenido de interoperación mediante un comportamiento en tiempo de ejecución.But you could also add the interoperation content through a runtime behavior.

  6. Procese los mensajes de la ventana seleccionada, como las notificaciones de control.Process selected window messages, such as control notifications. Existen dos enfoques.There are two approaches. Ambos proporcionan el mismo acceso a la secuencia de mensajes, por lo que su elección es más bien una cuestión de comodidad a la hora de programar.Both provide identical access to the message stream, so your choice is largely a matter of programming convenience.

    • Implemente el procesamiento de mensajes para todos los mensajes (no solo los mensajes de cierre HwndHost ) WndProcen la invalidación del método.Implement message processing for all messages (not just shutdown messages) in your override of the HwndHost method WndProc.

    • Haga que el WPFWPF elemento de hospedaje procese los mensajes controlando el MessageHook evento.Have the hosting WPFWPF element process the messages by handling the MessageHook event. Este evento se genera para cada mensaje que se envía al procedimiento de ventana principal de la ventana hospedada.This event is raised for every message that is sent to the main window procedure of the hosted window.

    • No se pueden procesar mensajes de ventanas que no estén en proceso WndProcmediante.You cannot process messages from windows that are out of process using WndProc.

  7. Comuníquese con la ventana hospedada usando una invocación de plataforma para llamar a la función SendMessage no administrada.Communicate with the hosted window by using platform invoke to call the unmanaged SendMessage function.

Si sigue estos pasos, creará una aplicación que funcionará con la entrada del ratón.Following these steps creates an application that works with mouse input. Puede Agregar compatibilidad con la tabulación para la ventana hospedada implementando la IKeyboardInputSink interfaz.You can add tabbing support for your hosted window by implementing the IKeyboardInputSink interface.

Cada uno de estos pasos se muestra en el código del tema Tutorial: Hospedar un control de Win32en WPF.Each of these steps is illustrated through code in the topic Walkthrough: Hosting a Win32 Control in WPF.

HWND dentro de WPFHwnds Inside WPF

Puede considerar HwndHost como un control especial.You can think of HwndHost as a special control. (Técnicamente, HwndHost es una FrameworkElement clase derivada, no una Control clase derivada, pero se puede considerar un control a efectos de interoperación). abstrae la naturaleza subyacente Win32Win32 del contenido hospedado de forma que el resto de WPFWPF considere que el contenido hospedado es otro objeto similar a un control, que debe representar y procesar la entrada. HwndHost(Technically, HwndHost is a FrameworkElement derived class, not a Control derived class, but it can be considered a control for purposes of interoperation.) HwndHost abstracts the underlying Win32Win32 nature of the hosted content such that the remainder of WPFWPF considers the hosted content to be another control-like object, which should render and process input. HwndHostgeneralmente se comporta como cualquier otro WPFWPF FrameworkElement, aunque hay algunas diferencias importantes en torno a la salida (dibujo y gráficos) y la entrada (mouse y teclado) en función de las limitaciones de lo que el HWND subyacente puede admitir.HwndHost generally behaves like any other WPFWPF FrameworkElement, although there are some important differences around output (drawing and graphics) and input (mouse and keyboard) based on limitations of what the underlying HWNDs can support.

Diferencias notables en el comportamiento de salidaNotable Differences in Output Behavior

  • FrameworkElement, que es la HwndHost clase base, tiene muy pocas propiedades que implican cambios en la interfaz de usuario.FrameworkElement, which is the HwndHost base class, has quite a few properties that imply changes to the UI. Esto incluye propiedades como FrameworkElement.FlowDirection, que cambia el diseño de los elementos dentro de ese elemento como un elemento primario.These include properties such as FrameworkElement.FlowDirection, which changes the layout of elements within that element as a parent. Pero la mayoría de estas propiedades no están asignadas a posibles equivalentes de Win32Win32, aunque dichos equivalentes existieran.However, most of these properties are not mapped to possible Win32Win32 equivalents, even if such equivalents might exist. Demasiadas de estas propiedades y de sus significados son tan específicos de la tecnología de representación que las asignaciones no resultan prácticas.Too many of these properties and their meanings are too rendering-technology specific for mappings to be practical. Por lo tanto, establecer propiedades FlowDirection como HwndHost on no tiene ningún efecto.Therefore, setting properties such as FlowDirection on HwndHost has no effect.

  • HwndHostno se puede girar, escalar, sesgar o afectar de otra manera a una transformación.HwndHost cannot be rotated, scaled, skewed, or otherwise affected by a Transform.

  • HwndHostno admite la Opacity propiedad (combinación alfa).HwndHost does not support the Opacity property (alpha blending). Si el contenido dentro HwndHost de System.Drawing realiza operaciones que incluyen información alfa, que no es una infracción, pero HwndHost como un todo solo admite la opacidad = 1,0 (100%).If content inside the HwndHost performs System.Drawing operations that include alpha information, that is itself not a violation, but the HwndHost as a whole only supports Opacity = 1.0 (100%).

  • HwndHostaparecerá encima de otros WPFWPF elementos de la misma ventana de nivel superior.HwndHost will appear on top of other WPFWPF elements in the same top-level window. Sin embargo, ToolTip un ContextMenu menú o generado es una ventana de nivel superior independiente y, por tanto, se HwndHostcomportará correctamente con.However, a ToolTip or ContextMenu generated menu is a separate top-level window, and so will behave correctly with HwndHost.

  • HwndHostno respeta la región de recorte de su UIElementelemento primario.HwndHost does not respect the clipping region of its parent UIElement. Esto puede ser un problema si intenta colocar una HwndHost clase dentro de una región de desplazamiento o. CanvasThis is potentially an issue if you attempt to put an HwndHost class inside a scrolling region or Canvas.

Diferencias notables en el comportamiento de entradaNotable Differences in Input Behavior

  • En general, mientras que los dispositivos de entrada están en HwndHost el Win32Win32 ámbito de la región hospedada, Win32Win32los eventos de entrada van directamente a.In general, while input devices are scoped within the HwndHost hosted Win32Win32 region, input events go directly to Win32Win32.

  • Mientras el mouse está sobre el HwndHost, la aplicación no recibe WPFWPF eventos del mouse y el valor falsede la WPFWPF propiedad IsMouseOver será.While the mouse is over the HwndHost, your application does not receive WPFWPF mouse events, and the value of the WPFWPF property IsMouseOver will be false.

  • Mientras tiene HwndHost el foco WPFWPF WPFWPF detecladoIsKeyboardFocusWithin , la aplicación no recibirá eventos de teclado y el valor de la propiedad será. falseWhile the HwndHost has keyboard focus, your application will not receive WPFWPF keyboard events and the value of the WPFWPF property IsKeyboardFocusWithin will be false.

  • Cuando el HwndHost foco está dentro de y cambia a otro control dentro HwndHostde, la aplicación no recibirá WPFWPF los GotFocus eventos LostFocuso.When focus is within the HwndHost and changes to another control inside the HwndHost, your application will not receive the WPFWPF events GotFocus or LostFocus.

  • Las propiedades y los eventos del lápiz relacionados son análogos y no informan de la HwndHostinformación mientras el lápiz está por encima.Related stylus properties and events are analogous, and do not report information while the stylus is over HwndHost.

Tabulación, teclas de acceso y aceleradoresTabbing, Mnemonics, and Accelerators

Las IKeyboardInputSink interfaces IKeyboardInputSite y permiten crear una experiencia de teclado sin problemas para aplicaciones WPFWPF mixtas y Win32Win32 :The IKeyboardInputSink and IKeyboardInputSite interfaces allow you to create a seamless keyboard experience for mixed WPFWPF and Win32Win32 applications:

  • Tabulación entre componentes de Win32Win32 y WPFWPFTabbing between Win32Win32 and WPFWPF components

  • Las teclas de acceso y los aceleradores que funcionan tanto si el foco está dentro de un componente de Win32 como si está dentro de un componente de WPF.Mnemonics and accelerators that work both when focus is within a Win32 component and when it is within a WPF component.

Las HwndHost clases HwndSource y proporcionan implementaciones de IKeyboardInputSink, pero es posible que no controlen todos los mensajes de entrada que desea para escenarios más avanzados.The HwndHost and HwndSource classes both provide implementations of IKeyboardInputSink, but they may not handle all the input messages that you want for more advanced scenarios. Invalide los métodos adecuados para obtener el comportamiento de teclado que quiera.Override the appropriate methods to get the keyboard behavior you want.

Las interfaces solo proporcionan compatibilidad para lo que ocurre en la transición entre las zonas de WPFWPF y Win32Win32.The interfaces only provide support for what happens on the transition between the WPFWPF and Win32Win32 regions. Dentro de la zona de Win32Win32, el comportamiento de la tabulación está totalmente controlado por la lógica implementada de Win32Win32 de la tabulación, en el caso de que la haya.Within the Win32Win32 region, tabbing behavior is entirely controlled by the Win32Win32 implemented logic for tabbing, if any.

Vea tambiénSee also