Архитектура WPFWPF Architecture

В этом разделе представлен обзор иерархии классов Windows Presentation Foundation (WPF).This topic provides a guided tour of the Windows Presentation Foundation (WPF) class hierarchy. Он охватывает большую часть основных подсистем WPFWPF и описывает их взаимодействие.It covers most of the major subsystems of WPFWPF, and describes how they interact. Здесь также подробно рассматриваются некоторые архитектурные решения WPFWPF.It also details some of the choices made by the architects of WPFWPF.

System.ObjectSystem.Object

Основная модель программирования WPFWPF доступна через управляемый код.The primary WPFWPF programming model is exposed through managed code. Ранее, на этапе проектирования WPFWPF, несколько раз обсуждалось, где следует провести черту между управляемыми и неуправляемыми компонентами системы.Early in the design phase of WPFWPF there were a number of debates about where the line should be drawn between the managed components of the system and the unmanaged ones. Среда CLR предоставляет ряд функций, повышающих производительность и надежность разработки (включая управление памятью, обработку ошибок, систему общих типов и т. д.), но они поставляются по цене.The CLR provides a number of features that make development more productive and robust (including memory management, error handling, common type system, etc.) but they come at a cost.

Основные компоненты WPFWPF показаны на приведенном ниже рисунке.The major components of WPFWPF are illustrated in the figure below. Красные разделы диаграммы (PresentationFramework, PresentationCore и milcore) представляют собой основные части кода WPFWPF.The red sections of the diagram (PresentationFramework, PresentationCore, and milcore) are the major code portions of WPFWPF. Только один из этих компонентов является неуправляемым — milcore.Of these, only one is an unmanaged component – milcore. Milcore написан на неуправляемом коде, чтобы обеспечить тесную интеграцию с DirectX.Milcore is written in unmanaged code in order to enable tight integration with DirectX. Все дисплеи в WPFWPF выполняются с помощью механизма DirectX, что обеспечивает эффективную визуализацию оборудования и программного обеспечения.All display in WPFWPF is done through the DirectX engine, allowing for efficient hardware and software rendering. Для WPFWPF также необходим тонкий контроль над памятью и выполнением.WPFWPF also required fine control over memory and execution. Механизм композиции в milcore чрезвычайно чувствителен к производительности, и для повышения производительности требуется предоставить множество преимуществ среды CLR.The composition engine in milcore is extremely performance sensitive, and required giving up many advantages of the CLR to gain performance.

Расположение WPF в .NET Framework.The position of WPF within the .NET Framework.

Связь между управляемыми и неуправляемыми частями WPFWPF обсуждается далее в этом разделе.Communication between the managed and unmanaged portions of WPFWPF is discussed later in this topic. Остальная часть управляемой модели программирования описана ниже.The remainder of the managed programming model is described below.

System.Threading.DispatcherObjectSystem.Threading.DispatcherObject

Большинство объектов в WPFWPF являются производными от DispatcherObject, который предоставляет базовые конструкции для работы с параллелизмом и многопоточностью.Most objects in WPFWPF derive from DispatcherObject, which provides the basic constructs for dealing with concurrency and threading. WPFWPF базируется на системе обмена сообщениями, реализуемой диспетчером.is based on a messaging system implemented by the dispatcher. Его работа очень похожа на работу обычного генератора сообщений в Win32Win32. В действительности диспетчер WPFWPF использует сообщения User32 для выполнения межпоточных вызовов.This works much like the familiar Win32Win32 message pump; in fact, the WPFWPF dispatcher uses User32 messages for performing cross thread calls.

Существует два основных понятия при обсуждении параллелизма в WPFWPF: диспетчер и сходство потоков.There are really two core concepts to understand when discussing concurrency in WPFWPF – the dispatcher and thread affinity.

На этапе проектирования WPFWPF основной целью был переход к одному потоку выполнения при непотоковой модели "со сходством".During the design phase of WPFWPF, the goal was to move to a single thread of execution, but a non-thread "affinitized" model. Сходство потоков случается, когда компонент использует идентификатор выполняемого потока для сохранения некоторых типов состояния.Thread affinity happens when a component uses the identity of the executing thread to store some type of state. Наиболее распространенной формой этого является использование локальной памяти потока (TLS) для сохранения состояния.The most common form of this is to use the thread local store (TLS) to store state. Сходство потоков требует, чтобы каждый логический поток выполнения принадлежал только одному физическому потоку в операционной системе, что создает большую нагрузку на память.Thread affinity requires that each logical thread of execution be owned by only one physical thread in the operating system, which can become memory intensive. В итоге потоковая модель WPF осталась согласованной с существующей потоковой моделью User32 однопотокового выполнения со сходством потоков.In the end, WPF’s threading model was kept in sync with the existing User32 threading model of single threaded execution with thread affinity. Основной причиной этого было взаимодействие — такие системы, как OLE 2,0, буфер обмена и Internet Explorer, нуждаются в выполнении однопотокового сходства (STA).The primary reason for this was interoperability – systems like OLE 2.0, the clipboard, and Internet Explorer all require single thread affinity (STA) execution.

При наличии объектов с организацией потоковой обработки STA необходим способ связи между потоками и проверки нахождения в правильном потоке.Given that you have objects with STA threading, you need a way to communicate between threads, and validate that you are on the correct thread. В этом заключается роль диспетчера.Herein lies the role of the dispatcher. Диспетчер — это основная система управления сообщениями, включающая несколько очередей с назначенными приоритетами.The dispatcher is a basic message dispatching system, with multiple prioritized queues. Примеры сообщений включают необработанные входящие уведомления (перемещение мыши), функции платформы (макет) или пользовательские команды (выполнение этого метода).Examples of messages include raw input notifications (mouse moved), framework functions (layout), or user commands (execute this method). Производя от DispatcherObject, вы создаете объект CLR, имеющий поведение STA, и ему присваивается указатель на Dispatcher во время создания.By deriving from DispatcherObject, you create a CLR object that has STA behavior, and will be given a pointer to a dispatcher at creation time.

System.Windows.DependencyObjectSystem.Windows.DependencyObject

Одним из основных архитектурных принципов, использовавшихся в построении WPFWPF, является предпочтение свойств методам или событиям.One of the primary architectural philosophies used in building WPFWPF was a preference for properties over methods or events. Свойства являются декларативными, и с их помощью проще указать цель, а не действие.Properties are declarative and allow you to more easily specify intent instead of action. Поддерживается также система для отображения содержимого пользовательского интерфейса на основе моделей (или данных).This also supported a model driven, or data driven, system for displaying user interface content. Такой подход обусловил создание дополнительных свойств, к которым можно осуществить привязку в целях лучшего управления поведением приложения.This philosophy had the intended effect of creating more properties that you could bind to, in order to better control the behavior of an application.

Для обеспечения большей части системы, управляемой свойствами, более обширная система свойств, чем нужна среда CLR.In order to have more of the system driven by properties, a richer property system than what the CLR provides was needed. Простым примером такой полноты являются уведомления об изменении.A simple example of this richness is change notifications. Для двусторонней привязки необходимо, чтобы обе стороны привязки поддерживали уведомления об изменениях.In order to enable two way binding, you need both sides of the bind to support change notification. Чтобы поведение зависело от значений свойств, необходимо получать уведомление в случае изменения значения свойства.In order to have behavior tied to property values, you need to be notified when the property value changes. Платформа Microsoft .NET имеет интерфейс INotifyPropertyChange, позволяющий объекту публиковать уведомления об изменениях, однако это необязательно.The Microsoft .NET Framework has an interface, INotifyPropertyChange, which allows an object to publish change notifications, however it is optional.

WPFWPF предоставляет более обширную систему свойств, производную от типа DependencyObject.provides a richer property system, derived from the DependencyObject type. Система свойств действительно является системой свойств "зависимостей" в том смысле, что она отслеживает зависимости между выражениями свойств и автоматически проверяет значение свойства при изменении зависимости.The property system is truly a "dependency" property system in that it tracks dependencies between property expressions and automatically revalidates property values when dependencies change. Например, если имеется свойство, наследуемое (например, FontSize), система автоматически обновляется, если свойство изменяется в родительском элементе элемента, который наследует значение.For example, if you have a property that inherits (like FontSize), the system is automatically updated if the property changes on a parent of an element that inherits the value.

Основой системы свойств WPFWPF является понятие "выражение свойства".The foundation of the WPFWPF property system is the concept of a property expression. В этом первом выпуске WPFWPF система выражений свойств закрыта и все выражения предоставлены как часть платформы.In this first release of WPFWPF, the property expression system is closed, and the expressions are all provided as part of the framework. Выражения объясняют, почему система свойств не поддерживает привязку к данным, создание стилей или жестко заданное наследование, но вместо этого представлена слоями более поздних версий в платформе.Expressions are why the property system doesn’t have data binding, styling, or inheritance hard coded, but rather provided by later layers within the framework.

Система свойств также предоставляет способ разреженного хранения значений свойств.The property system also provides for sparse storage of property values. Так как объекты могут иметь десятки (если не сотни) свойств и большинство значений находится в состоянии по умолчанию (унаследованы, задаются стилем и т. д.), не каждый экземпляр объекта должен иметь все определенные в нем свойства в полном объеме.Because objects can have dozens (if not hundreds) of properties, and most of the values are in their default state (inherited, set by styles, etc.), not every instance of an object needs to have the full weight of every property defined on it.

Наконец, последняя новая особенность системы свойств — это понятие присоединенных свойств.The final new feature of the property system is the notion of attached properties. Элементы WPFWPF базируются на принципе композиции и многократного использования компонентов.WPFWPF elements are built on the principle of composition and component reuse. Часто бывает так, что некоторым содержащим элементом (например, элементу макета Grid) требуются дополнительные данные дочерних элементов, чтобы управлять его поведением (например, сведениями о строках и столбцах).It is often the case that some containing element (like a Grid layout element) needs additional data on child elements to control its behavior (like the Row/Column information). Вместо того чтобы сопоставлять все эти свойства с каждым элементом, любой объект может предоставить определения свойств для любого другого объекта.Instead of associating all of these properties with every element, any object is allowed to provide property definitions for any other object. Это похоже на возможности expando в JavaScript.This is similar to the "expando" features of JavaScript.

System.Windows.Media.VisualSystem.Windows.Media.Visual

После определения системы следующим шагом является рисование пикселей на экране.With a system defined, the next step is getting pixels drawn to the screen. Класс Visual предоставляет для создания дерева визуальных объектов, каждый из которых при необходимости содержит инструкции по рисованию и метаданные о том, как визуализировать эти инструкции (обрезка, преобразование и т. д.).The Visual class provides for building a tree of visual objects, each optionally containing drawing instructions and metadata about how to render those instructions (clipping, transformation, etc.). Visual является чрезвычайно упрощенной и гибкой, поэтому большинство функций не имеют открытых интерфейсов API и сильно зависят от защищенных функций обратного вызова.Visual is designed to be extremely lightweight and flexible, so most of the features have no public API exposure and rely heavily on protected callback functions.

Visual на самом деле является точкой входа в систему WPFWPF компоновки.Visual is really the entry point to the WPFWPF composition system. Visual является точкой подключения между этими двумя подсистемами, управляемым API и неуправляемым milcore.Visual is the point of connection between these two subsystems, the managed API and the unmanaged milcore.

WPFWPF отображает данные, проходя по неуправляемым структурам данных под управлением milcore.displays data by traversing the unmanaged data structures managed by the milcore. Эти структуры, называемые узлами композиции, представляют собой иерархическое дерево отображения с инструкциями по отрисовке в каждом узле.These structures, called composition nodes, represent a hierarchical display tree with rendering instructions at each node. Это дерево, показанное в правой части расположенного ниже рисунка, доступно только через протокол обмена сообщениями.This tree, illustrated on the right hand side of the figure below, is only accessible through a messaging protocol.

При программировании WPFWPFсоздаются Visual элементы и производные типы, которые внутренне взаимодействуют с деревом композиции через этот протокол обмена сообщениями.When programming WPFWPF, you create Visual elements, and derived types, which internally communicate to the composition tree through this messaging protocol. Каждый Visual в WPFWPF может создать один или несколько узлов композиции.Each Visual in WPFWPF may create one, none, or several composition nodes.

Визуальное дерево Windows Presentation Foundation.The Windows Presentation Foundation Visual Tree.

Здесь имеется один очень важный архитектурный момент — все дерево визуальных объектов и инструкций по рисованию кэшируется.There is a very important architectural detail to notice here – the entire tree of visuals and drawing instructions is cached. С графической точки зрения, WPFWPF использует систему сохраненной отрисовки.In graphics terms, WPFWPF uses a retained rendering system. Это позволяет системе осуществлять перерисовку с высокой частотой без блокирования системы композиции при обратных вызовах, обращенных к коду пользователя.This enables the system to repaint at high refresh rates without the composition system blocking on callbacks to user code. Это помогает предотвратить признаки неотвечающего приложения.This helps prevent the appearance of an unresponsive application.

Другим важным моментом, который не заметен на схеме, является то, как система в действительности выполняет композицию.Another important detail that isn’t really noticeable in the diagram is how the system actually performs composition.

В user32 и GDI система работает в режиме немедленной обрезки системы.In User32 and GDI, the system works on an immediate mode clipping system. Когда требуется визуализация компонента, система устанавливает границы обрезки, вне которых компонент не может изменять пиксели, а затем компонент запрашивает рисование пикселей в этой области.When a component needs to be rendered, the system establishes a clipping bounds outside of which the component isn’t allowed to touch the pixels, and then the component is asked to paint pixels in that box. Эта система работает очень хорошо в системах с ограниченной памятью, так как в случае каких-либо изменений приходится иметь дело только с измененным компонентом — два компонента никогда не воздействуют на цвет одного пикселя.This system works very well in memory constrained systems because when something changes you only have to touch the affected component – no two components ever contribute to the color of a single pixel.

WPFWPF использует "алгоритм рисования" для модели рисования.uses a "painter's algorithm" painting model. Это означает, что вместо обрезки каждого компонента каждый компонент запрашивается для отрисовки, начиная с заднего плана и до переднего плана отображения.This means that instead of clipping each component, each component is asked to render from the back to the front of the display. Это позволяет рисовать каждый компонент поверх отображения предыдущего компонента.This allows each component to paint over the previous component's display. Преимуществом этой модели является то, что можно создавать сложные полупрозрачные фигуры.The advantage of this model is that you can have complex, partially transparent shapes. Благодаря современной современного графического оборудования эта модель относительно быстра (что не так, когда создавалась user32 или GDI).With today’s modern graphics hardware, this model is relatively fast (which wasn’t the case when User32/ GDI were created).

Как упоминалось ранее, основным принципом WPFWPF является переход к более декларативной, "ориентированной на свойства" модели программирования.As mentioned previously, a core philosophy of WPFWPF is to move to a more declarative, "property centric" model of programming. В визуальной системе это проявляется в паре любопытных моментов.In the visual system, this shows up in a couple of interesting places.

Во-первых, если говорить о сохраненном режиме графической системы, он действительно отражает переход от императивной модели DrawLine/DrawLine к модели, ориентированной на данные, — new Line()/new Line().First, if you think about the retained mode graphic system, this is really moving away from an imperative DrawLine/DrawLine type model, to a data oriented model – new Line()/new Line(). Этот переход к управляемой данными отрисовке позволяет выполнять сложные операции в инструкциях по рисованию, выражаемых с помощью свойств.This move to data driven rendering allows complex operations on the drawing instructions to be expressed using properties. Типы, производные от Drawing, фактически являются объектной моделью для подготовки к просмотру.The types deriving from Drawing are effectively the object model for rendering.

Во-вторых, оценивая систему анимации, можно увидеть, что она является практически полностью декларативной.Second, if you evaluate the animation system, you'll see that it is almost completely declarative. Вместо обязательного вычисления разработчиком следующего положения или цвета можно выразить анимации как набор свойств для объекта анимации.Instead of requiring a developer to compute the next location, or next color, you can express animations as a set of properties on an animation object. Эти анимации могут выражать замыслы разработчика или проектировщика (переместить эту кнопку отсюда туда в течение 5 секунд), и система может определить наиболее эффективный способ для их выполнения.These animations can then express the intent of the developer or designer (move this button from here to there in 5 seconds), and the system can determine the most efficient way to accomplish that.

System.Windows.UIElementSystem.Windows.UIElement

UIElement определяет основные подсистемы, включая макет, ввод и события.UIElement defines core subsystems including Layout, Input, and Events.

Макет представляет собой основное понятие в WPFWPF.Layout is a core concept in WPFWPF. Во многих системах либо присутствует фиксированный набор моделей для макетов (HTML поддерживает три модели для макетов: поток, абсолютное значение и таблицы), либо вообще нет модели для макета (User32 в действительности поддерживает только абсолютное размещение).In many systems there is either a fixed set of layout models (HTML supports three models for layout; flow, absolute, and tables) or no model for layout (User32 really only supports absolute positioning). Предпосылкой для создания WPFWPF стало желание разработчиков и конструкторов иметь гибкую, расширяемую модель макета, которая управлялась бы значениями свойств, а не императивной логикой.WPFWPF started with the assumption that developers and designers wanted a flexible, extensible layout model, which could be driven by property values rather than imperative logic. На уровне UIElement доступен базовый контракт для макета — модель из двух этапов с Measure и Arrange.At the UIElement level, the basic contract for layout is introduced – a two phase model with Measure and Arrange passes.

Measure позволяет компоненту определить размер, который должен быть занят.Measure allows a component to determine how much size it would like to take. Это отдельный этап от Arrange, так как существует множество ситуаций, когда родительский элемент запрашивает у дочернего элемента несколько раз, чтобы определить его оптимальное расположение и размер.This is a separate phase from Arrange because there are many situations where a parent element will ask a child to measure several times to determine its optimal position and size. Тот факт, что родительские элементы запрашивают измерение дочерних, демонстрирует еще один ключевой принцип WPFWPF — размер по содержимому.The fact that parent elements ask child elements to measure demonstrates another key philosophy of WPFWPF – size to content. Все элементы управления в WPFWPF поддерживают возможность изменения размера по размеру их содержимого.All controls in WPFWPF support the ability to size to the natural size of their content. Это значительно упрощает локализацию и позволяет осуществлять динамическую компоновку элементов в соответствии с изменением размеров.This makes localization much easier, and allows for dynamic layout of elements as things resize. Этап Arrange позволяет родительскому элементу позиционировать и определять конечный размер каждого дочернего элемента.The Arrange phase allows a parent to position and determine the final size of each child.

Часто приходится говорить о части выходных данных WPFWPFVisual и связанных с ними объектов.A lot of time is often spent talking about the output side of WPFWPFVisual and related objects. Однако существует также множество новшеств со стороны ввода данных.However there is a tremendous amount of innovation on the input side as well. Вероятно, наиболее фундаментальным изменением в модели ввода для WPFWPF является согласованная модель, в соответствии с которой события ввода направляются через систему.Probably the most fundamental change in the input model for WPFWPF is the consistent model by which input events are routed through the system.

Ввод возникает как сигнал драйверу устройства режима ядра и направляется в нужный процесс и поток через сложный процесс, в котором участвуют ядро Windows и User32.Input originates as a signal on a kernel mode device driver and gets routed to the correct process and thread through an intricate process involving the Windows kernel and User32. После того как сообщение User32, соответствующее входным данным, направлено в WPFWPF, оно преобразуется в сообщение с необработанными входными данными WPFWPF и отправляется диспетчеру.Once the User32 message corresponding to the input is routed to WPFWPF, it is converted into a WPFWPF raw input message and sent to the dispatcher. WPFWPF позволяет преобразовывать события с необработанными входными данными в несколько фактических событий, обеспечивая реализацию таких функций, как MouseEnter, на низких уровнях системы с гарантированной доставкой.allows for raw input events to be converted to multiple actual events, enabling features like "MouseEnter" to be implemented at a low level of the system with guaranteed delivery.

Каждое событие ввода преобразуется по крайней мере в два события: событие предварительное и событие фактическое.Each input event is converted to at least two events – a "preview" event and the actual event. Все события в WPFWPF имеют представление о маршрутизации через дерево элементов.All events in WPFWPF have a notion of routing through the element tree. События говорят «пузырьковой», если они переходят от конечной папки к корневому элементу, и говорят о «туннеле», если они начинаются с корня и проходят до целевого объекта.Events are said to "bubble" if they traverse from a target up the tree to the root, and are said to "tunnel" if they start at the root and traverse down to a target. Предварительные события ввода перемещаются по нисходящей, причем любые элементы в дереве могут фильтровать или обрабатывать событие.Input preview events tunnel, enabling any element in the tree an opportunity to filter or take action on the event. Обычные события (не предварительные) перемещаются по восходящей от конечной точки вверх к корню.The regular (non-preview) events then bubble from the target up to the root.

Это разделение между нисходящим и восходящими этапами делает возможным согласованную реализацию таких возможностей, как сочетания клавиш.This split between the tunnel and bubble phase makes implementation of features like keyboard accelerators work in a consistent fashion in a composite world. В User32 сочетания клавиш реализуются посредством одной глобальной таблицы, содержащей все необходимые сочетания клавиш (CTRL+N сопоставляется с командой "Создать").In User32 you would implement keyboard accelerators by having a single global table containing all the accelerators you wanted to support (Ctrl+N mapping to "New"). В диспетчере приложения вызывается метод TranslateAccelerator, который будет анализировать сообщения ввода в User32 и определять их соответствие зарегистрированному сочетанию клавиш.In the dispatcher for your application you would call TranslateAccelerator which would sniff the input messages in User32 and determine if any matched a registered accelerator. В WPFWPF это не работает, так как система полностью "компонуема" — любой элемент может обрабатывать и использовать любые сочетания клавиш.In WPFWPF this wouldn’t work because the system is fully "composable" – any element can handle and use any keyboard accelerator. Наличие такой двухэтапной модели для ввода позволяет компонентам реализовать собственные методы TranslateAccelerator.Having this two phase model for input allows components to implement their own "TranslateAccelerator".

Чтобы выполнить этот шаг дальше, UIElement также познакомится с понятием CommandBindings.To take this one step further, UIElement also introduces the notion of CommandBindings. Система команд WPFWPF позволяет разработчикам определять функциональные возможности в терминах конечной точки команды — что-то, которое реализует ICommand.The WPFWPF command system allows developers to define functionality in terms of a command end point – something that implements ICommand. Привязки команд позволяют элементу определять соответствие между действием ввода (CTRL+N) и командой ("Создать").Command bindings enable an element to define a mapping between an input gesture (Ctrl+N) and a command (New). И действия ввода, и определения команд являются расширяемыми и могут быть связаны вместе во время использования.Both the input gestures and command definitions are extensible, and can be wired together at usage time. Это делается, например, для того чтобы конечный пользователь мог легко настраивать привязки клавиш, которые ему необходимо использовать в приложении.This makes it trivial, for example, to allow an end user to customize the key bindings that they want to use within an application.

До этого момента в разделе рассматривались "основные" возможности WPFWPF — возможности, реализованные в сборке PresentationCore.To this point in the topic, "core" features of WPFWPF – features implemented in the PresentationCore assembly, have been the focus. При создании WPFWPFнужно четкое разделение между базовыми частями (например, контрактом для макета с мерами и структурой ) иэлементами платформы (например, реализация определенного макета, например Grid), была желаемым результатом.When building WPFWPF, a clean separation between foundational pieces (like the contract for layout with Measure and Arrange) and framework pieces (like the implementation of a specific layout like Grid) was the desired outcome. Целью являлось предоставление точки расширяемости внизу стека, что позволило бы внешним разработчикам при необходимости создавать свои собственные платформы.The goal was to provide an extensibility point low in the stack that would allow external developers to create their own frameworks if needed.

System.Windows.FrameworkElementSystem.Windows.FrameworkElement

FrameworkElement можно рассматривать двумя разными способами.FrameworkElement can be looked at in two different ways. Он предоставляет набор политик и настроек для подсистем, введенных на нижнем уровне WPFWPF.It introduces a set of policies and customizations on the subsystems introduced in lower layers of WPFWPF. В нем также вводится набор новых подсистем.It also introduces a set of new subsystems.

Основная политика, появившаяся FrameworkElement, связана с макетом приложения.The primary policy introduced by FrameworkElement is around application layout. FrameworkElement основан на базовом контракте макета, представленном UIElement, и добавляет понятие "слот" макета, что упрощает авторам макетов единообразный набор семантик макетов, управляемых свойствами.FrameworkElement builds on the basic layout contract introduced by UIElement and adds the notion of a layout "slot" that makes it easier for layout authors to have a consistent set of property driven layout semantics. Такие свойства, как HorizontalAlignment, VerticalAlignment, MinWidthи Margin (несколько имен), предоставляют всем компонентам, производным от FrameworkElement, единообразное поведение в контейнерах макета.Properties like HorizontalAlignment, VerticalAlignment, MinWidth, and Margin (to name a few) give all components derived from FrameworkElement consistent behavior inside of layout containers.

FrameworkElement также предоставляет более простой интерфейс API для многих функций, имеющихся в основных уровнях WPFWPF.FrameworkElement also provides easier API exposure to many features found in the core layers of WPFWPF. Например, FrameworkElement предоставляет прямой доступ к анимации с помощью метода BeginStoryboard.For example, FrameworkElement provides direct access to animation through the BeginStoryboard method. Storyboard предоставляет способ создания скрипта для нескольких анимаций по набору свойств.A Storyboard provides a way to script multiple animations against a set of properties.

Две наиболее важные вещи, которые FrameworkElement представляют, являются привязкой и стилями данных.The two most critical things that FrameworkElement introduces are data binding and styles.

Подсистема привязки данных в WPFWPF должна быть относительно знакома всем, кто использовал Windows FormsWindows Forms или ASP.NET для создания пользовательский интерфейсuser interface (UI)приложений.The data binding subsystem in WPFWPF should be relatively familiar to anyone that has used Windows FormsWindows Forms or ASP.NET for creating an application пользовательский интерфейсuser interface (UI). В каждой из этих систем есть простой способ выразить, что одно или несколько свойств данного элемента необходимо привязать к элементу данных.In each of these systems, there is a simple way to express that you want one or more properties from a given element to be bound to a piece of data. WPFWPF обладает полным набором возможностей для привязки свойств, преобразования и привязки списков.has full support for property binding, transformation, and list binding.

Одной из наиболее интересных возможностей привязки данных в WPFWPF является введение шаблонов данных.One of the most interesting features of data binding in WPFWPF is the introduction of data templates. Шаблоны данных позволяют декларативно указывать способ визуализации фрагмента данных.Data templates allow you to declaratively specify how a piece of data should be visualized. Вместо создания настраиваемого пользовательского интерфейса, который может быть привязан к данным, можно обойти проблему и позволить данным определять способ отображения.Instead of creating a custom user interface that can be bound to data, you can instead turn the problem around and let the data determine the display that will be created.

Создание стилей — это облегченная форма привязки данных.Styling is really a lightweight form of data binding. Посредством создания стилей можно привязать набор свойств из общего определения к одному или нескольким экземплярам элемента.Using styling you can bind a set of properties from a shared definition to one or more instances of an element. Стили применяются к элементу посредством явной ссылки (путем установки свойства Style) или неявно путем связывания стиля с типом CLR элемента.Styles get applied to an element either by explicit reference (by setting the Style property) or implicitly by associating a style with the CLR type of the element.

System.Windows.Controls.ControlSystem.Windows.Controls.Control

Наиболее значимая возможность для элемента управления — это использование шаблонов.Control’s most significant feature is templating. Если представлять себе систему композиции WPF как систему отрисовки сохраненного режима, то шаблоны позволяют элементу управления описывать свою отрисовку в параметризированной, декларативной форме.If you think about WPF’s composition system as a retained mode rendering system, templating allows a control to describe its rendering in a parameterized, declarative manner. ControlTemplate, на самом деле, является лишь сценарием создания набора дочерних элементов с привязками к свойствам, предлагаемым элементом управления.A ControlTemplate is really nothing more than a script to create a set of child elements, with bindings to properties offered by the control.

Control предоставляет набор стандартных свойств, Foreground, Background, Padding, для названия нескольких, которые авторы шаблонов могут использовать для настройки представления элемента управления.Control provides a set of stock properties, Foreground, Background, Padding, to name a few, which template authors can then use to customize the display of a control. Реализация элемента управления обеспечивает модель данных и модель взаимодействия.The implementation of a control provides a data model and interaction model. Модель взаимодействия определяет набор команд (таких как "Закрыть" для окна) и привязки к действиям ввода (таким как нажатие красного символа X в верхнем углу окна).The interaction model defines a set of commands (like Close for a window) and bindings to input gestures (like clicking the red X in the upper corner of the window). Модель данных предоставляет набор свойств либо для настройки модели взаимодействия, либо для настройки отображения (определяется шаблоном).The data model provides a set of properties to either customize the interaction model or customize the display (determined by the template).

Это разделение между моделью данных (свойства), моделью взаимодействия (команды и события) и моделью отображения (шаблоны) позволяет полностью настроить внешний вид и поведение элемента управления.This split between the data model (properties), interaction model (commands and events), and display model (templates) enables complete customization of a control’s look and behavior.

Типичным аспектом модели данных элементов управления является модель содержимого.A common aspect of the data model of controls is the content model. Если взглянуть на элемент управления, например Button, вы увидите, что у него есть свойство с именем "Content" типа Object.If you look at a control like Button, you will see that it has a property named "Content" of type Object. В Windows FormsWindows Forms и ASP.NET это свойство обычно является строкой, но ограничивает тип содержимого, которое можно добавить в кнопку.In Windows FormsWindows Forms and ASP.NET, this property would typically be a string – however that limits the type of content you can put in a button. Содержимое для кнопки может представлять собой простую строку, сложный объект данных или все дерево элементов.Content for a button can either be a simple string, a complex data object, or an entire element tree. В случае объекта данных используется шаблон данных для создания отображения.In the case of a data object, the data template is used to construct a display.

СводкаSummary

WPFWPF предназначается для создания динамических, управляемых данными систем представления.is designed to allow you to create dynamic, data driven presentation systems. Каждая часть системы предназначена для создания объектов с помощью наборов свойств, которые определяют их поведение.Every part of the system is designed to create objects through property sets that drive behavior. Привязка данных является основополагающей частью системы и интегрирована на каждом уровне.Data binding is a fundamental part of the system, and is integrated at every layer.

Традиционные приложения создают отображение, а затем привязывают его к некоторым данным.Traditional applications create a display and then bind to some data. В WPFWPF все, что касается элемента управления, каждый аспект отображения, создается посредством некоторого типа привязки данных.In WPFWPF, everything about the control, every aspect of the display, is generated by some type of data binding. Текст внутри кнопки отображается путем создания составного элемента управления внутри кнопки и привязки его отображения к свойству содержимого кнопки.The text found inside a button is displayed by creating a composed control inside of the button and binding its display to the button’s content property.

В начале разработки приложений на основе WPFWPF все должно быть знакомо.When you begin developing WPFWPF based applications, it should feel very familiar. Можно задать свойства, использовать объекты и привязывать данные во многом так же, как можно использовать Windows FormsWindows Forms или ASP.NET.You can set properties, use objects, and data bind in much the same way that you can using Windows FormsWindows Forms or ASP.NET. При углублении в архитектуру WPFWPF вы обнаружите, что можно создавать значительно более сложные приложения, которые фундаментально обрабатывают данные, как драйвер ядра приложения.With a deeper investigation into the architecture of WPFWPF, you'll find that the possibility exists for creating much richer applications that fundamentally treat data as the core driver of the application.

См. такжеSee also