Создание шаблона элемента управления

3 ответа

Лучший ответ

находится внутри вашего .

Следовательно, у вашего есть свойство (/ instance) вашего .

Примечание. Если вам также нужна ссылка на внутри вашего , передайте ее конструктору и сохраните как свойство.

В xaml это будет выглядеть так (внутри ):

Не забудьте :

Изменить после обновления вопроса:

Это пример с частью вашего кода для демонстрации WPF и MVVM в действии. Вы просто определяете в своем , а затем передаете через экземпляр вашего . WPF знает, что есть для этого типа, и добавит экземпляр , где находится .

2

Blacktempel
24 Янв 2018 в 13:37

Элементы управления Microsoft WPF создаются с помощью DependencyProperties

DependencyProperty поддерживает следующие возможности, которые вы теряете при внедрении модели представления для конкретного элемента управления:

  • DP может быть установлен в стиле / триггере (важны стили и шаблоны, разработчики часто хотят повторно использовать функциональность элемента управления, но полностью изменяют внешний вид)

  • DP может быть установлен посредством привязки данных (которая включает перекрестную привязку между двумя элементами управления)

  • DP может наследовать свое значение автоматически от родительского элемента в дереве элементов

  • DP можно анимировать

1

ASh
24 Янв 2018 в 13:43

Распределение ресурсов между ViewModels является распространенным сценарием, однако, как правило, он является хорошим индикатором того, что что-то идет не так в архитектуре — или ее отсутствие — если это становится проблемой.

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

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

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

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

Другим преимуществом использования вместо перекрестных ссылок является то, что это дает вам возможность фактически следовать ТВЕРДЫЕ принципы объектно-ориентированного программирования и наличие логики в том месте, к которому оно принадлежит, без дублирования.

После этого можно использовать IoC-контейнер для правильного добавления ссылок и зависимостей во время выполнения, однако это может привести к скрытым зависимостям и чертовски много времени на подготовку с настройкой проекта, документацией и т. д., если выполнено неправильно и / или впервые. Лично я бы не пошел по этому пути, если каждый член команды на самом деле не знает, что он делает полностью.

2

Jirajha
24 Янв 2018 в 13:47

Включение панели для получения потерянных данных

В этом разделе вы включите панели, в которых размещаются пользовательские элементы управления Circle, чтобы они выступали в качестве целей перетаскивания для перетаскиваемых данных круга. Будет реализован код, позволяющий перемещать круг с одной панели на другую или создавать копию элемента управления Circle, удерживая нажатой клавишу CTRL при перетаскивании и перетаскивании окружности.

  1. Откройте файл MainWindow.xaml.

  2. Как показано в следующем коде XAML, в каждом элементе StackPanel управления добавьте обработчики для DragOver Drop событий и. Назовите DragOver обработчик событий, и присвойте ему имя Drop .

  3. Откройте файл MainWindows.xaml.cs или MainWindow.xaml.vb.

  4. Добавьте следующий код для DragOver обработчика событий.

    Этот DragOver обработчик событий выполняет следующие задачи:

    • Проверяет, что перетаскиваемые данные содержат данные «Object», которые были упакованы в DataObject с помощью пользовательского элемента управления Circle и передаются в вызов DoDragDrop .

    • Если имеются данные объекта, проверяет, нажата ли клавиша CTRL .

    • Если нажата клавиша CTRL , присваивает Effects свойству значение . В противном случае присвойте Effects свойству значение .

  5. Добавьте следующий код для Drop обработчика событий.

    Этот Drop обработчик событий выполняет следующие задачи:

    • Проверяет, было ли Drop событие уже обработано. Например, если окружность отбрасывается на другой круг, который обрабатывает Drop событие, то панель, содержащая окружность, также не должна обрабатываться.

    • Если Drop событие не обрабатывается, проверяет, нажата ли клавиша CTRL .

    • Если нажата клавиша CTRL , когда Drop происходит, создает копию элемента управления Circle и добавляет ее в Children коллекцию StackPanel .

    • Если клавиша CTRL не нажата, перемещает окружность из Children коллекции родительской панели в Children коллекцию панели, в которой она была удалена.

    • Задает Effects свойство для уведомления метода о DoDragDrop том, была ли выполнена операция перемещения или копирования.

  6. Нажмите клавишу F5 для сборки и запуска приложения.

  7. Выберите текст из TextBox .

  8. Перетащите текст над элементом управления Circle и опустите его на элемент.

  9. Перетащите элемент управления Circle из левой панели в правую панель и опустите его. Окружность удаляется из Children коллекции левой панели и добавляется в коллекцию Children правой панели.

  10. Перетащите элемент управления Circle с панели на другую панель и поместите его, удерживая нажатой клавишу CTRL . Окружность копируется, а копия добавляется в Children коллекцию принимающей панели.

Consuming/using the User Control

With the above code in place, all we need is to consume (use) the User control within our Window. We’ll do that by adding a reference to the namespace the UserControl lives in, in the top of the XAML code of your Window:

After that, we can use the uc prefix to add the control to our Window like it was any other WPF control:

Notice how we use the Title and MaxLength properties directly in the XAML. Here’s the full code sample for our window:

With that, we can reuse this entire piece of functionality in a single line of code, as illustrated in this example where we have the limited text input control two times. As already shown, the final result looks like this:

Methods

Copies the content control from the active document to the Clipboard.

Removes the content control from the active document and moves the content control to the Clipboard.

Deletes the specified content control and the contents of the content control.

Sets the symbol used to represent the checked state of a check box content control.

Sets the placeholder text that displays in the content control until a user enters their own text.

Sets the symbol used to represent the unchecked state of a check box content control.

Removes a group content control from a document so that its child content controls are no longer nested and can be freely edited.

Modifying Placeholder Text to a Content Control

Placeholder text is temporary text. It can be a simple one-word or two-word description (similar to the title) or it can be a more thorough description (such as numbered steps). Modifying the placeholder text is the same regardless of the type of content control or the expected contents of the content control. The following example adds a drop-down list to the active document, sets the placeholder text for the control, and then fills the list with the names of several animals.

These are just a few of the ways that you can use the object model to manipulate content controls in your documents. For more examples, see the How To section.

Support and feedback

Have questions or feedback about Office VBA or this documentation? Please see Office VBA support and feedback for guidance about the ways you can receive support and provide feedback.

Definition

Namespace:
Microsoft.Office.Interop.Word
Assembly:
Microsoft.Office.Interop.Word.dll

Important

Some information relates to prerelease product that may be substantially modified before it’s released. Microsoft makes no warranties, express or implied, with respect to the information provided here.

An individual content control. Content controls are bounded and potentially labeled regions in a document that serve as containers for specific types of content. Individual content controls may contain contents such as dates, lists, or paragraphs of formatted text. The ContentControl object is a member of the ContentControls collection.

Свойства

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

Возвращает или задает внешний вид элемента управления содержимым. Чтение и записьWdContentControlAppearance

Возвращает _Application объект, представляющий приложение Microsoft Word.

Возвращает или задает категорию для элемента управления содержимым «Стандартный блок». Для чтения и записи.

Возвращает или задает тип стандартного блока для элемента управления содержимым «Стандартный блок». Для чтения и записи.

Получает или задает текущее состояние флажка (флажок установлен/снят).

Возвращает или задает цвет элемента управления содержимым. Чтение и запись WdColor .

Возвращает 32 — разрядное целое число, которое указывает приложение, в котором была создана надстройка. Только для чтения.

Возвращает или задает тип календаря для элемента управления содержимым «Календарь». Для чтения и записи.

Возвращает или задает формат, в котором отображаются даты. Для чтения и записи.

Возвращает языковой формат даты, отображаемой в элементе управления содержимым «Дата». Для чтения и записи.

Возвращает или задает формат хранения и извлечения дат, когда элемент управления содержимым «Дата» привязан к хранилищу XML-данных активного документа. Для чтения и записи.

Возвращает или задает имя стиля символов, который будет использоваться для форматирования текста в элементе управления текстовым содержимым. Для чтения и записи.

Возвращает элементы в элементе управления содержимым раскрывающегося списка или в элементе управления содержимым «поле со списком». Только для чтения.

Возвращает идентификатор для элемента управления содержимым. Только для чтения.

Возвращает уровень элемента управления содержимым — содержит ли элемент управления содержимым текст, абзацы, ячейки таблицы или строки таблицы; или, если он является встроенным. Только для чтения WdContentControlLevel .

Возвращает или задает логическое значение , которое указывает, может ли пользователь удалить элемент управления содержимым из активного документа. Для чтения и записи.

Возвращает или задает логическое значение , которое указывает, может ли пользователь изменять содержимое элемента управления содержимым. Для чтения и записи.

Возвращает логическое значение , которое указывает, поддерживает ли элемент управления текстовым контентом несколько строк текста. Для чтения и записи.

Возвращает объект, представляющий родительский объект указанного ContentControl объекта.

Возвращает родительский элемент управления содержимым для элемента управления содержимым, вложенного в элемент управления «форматированный текст» или «Группа». Только для чтения.

Возвращает BuildingBlock объект, представляющий замещающий текст для элемента управления содержимым. Только для чтения.

Возвращает объект Range , представляющий содержимое элемента управления содержимым в активном документе. Только для чтения.

Возвращает коллекцию элементов повторяющихся разделов в указанном элементе управления содержимым «повторяющийся раздел». Только для чтения.

Возвращает или задает имя элементов повторяющихся разделов, используемых в контекстном меню, связанном с указанным элементом управления содержимым «повторяющийся раздел». Для чтения и записи.

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

Возвращает или задает значение для идентификации элемента управления содержимым. Для чтения и записи.

Возвращает или задает логическое значение , которое указывает, следует ли удалить элемент управления содержимым из активного документа, когда пользователь редактирует содержимое этого элемента управления. Для чтения и записи.

Возвращает или задает заголовок для элемента управления содержимым. Для чтения и записи.

Возвращает или задает тип элемента управления содержимым. Для чтения и записи.

Возвращает сопоставление элемента управления содержимым с данными XML в хранилище данных документа. Только для чтения.

Properties

Gets or sets whether users can add or remove sections from the specified repeating section content control by using the user interface.

Returns or sets the appearance of the content control. Read/write WdContentControlAppearance

Returns an _Application object that represents the Microsoft Word application.

Returns or sets the category for a building block content control. Read/write.

Returns or sets the type of building block for a building block content control. Read/write.

Gets or sets the current state (checked/unchecked) for a check box.

Returns or sets the color of the content control. Read/write WdColor.

Returns a 32-bit integer that indicates the application in which the add-in was created. Read-only.

Returns or sets the calendar type for a calendar content control. Read/write.

Returns or sets the format in which dates are displayed. Read/write.

Returns a the language format for the date displayed in a date content control. Read/write.

Returns or sets the format for storage and retrieval of dates when a date content control is bound to the XML data store of the active document. Read/write.

Returns or sets the name of the character style to use to format text in a text content control. Read/write.

Returns the items in a drop-down list content control or in a combo box content control. Read-only.

Returns the identification for a content control. Read-only.

Returns the level of the content control—whether the content control surrounds text, paragraphs, table cells, or table rows; or if it is inline. Read-only WdContentControlLevel.

Returns or sets a Boolean that represents whether the user can delete a content control from the active document. Read/write.

Returns or sets a Boolean that represents whether the user can edit the contents of a content control. Read/write.

Returns a Boolean that represents whether a text content control allows multiple lines of text. Read/write.

Returns an that represents the parent object of the specified ContentControl object.

Returns the parent content control for a content control that is nested inside a rich-text control or group control. Read-only.

Returns a BuildingBlock object that represents the placeholder text for a content control. Read-only.

Returns a Range that represents the contents of the content control in the active document. Read-only.

Returns the collection of repeating section items in the specified repeating section content control. Read-only.

Returns or sets the name of the repeating section items used in the context menu associated with the specified repeating section content control. Read/write.

Returns a Boolean that indicates whether the placeholder text for the content control is displayed. Read-only.

Returns or sets a value to identify a content control. Read/write.

Returns or sets a Boolean that represents whether to remove a content control from the active document when the user edits the contents of the control. Read/write.

Returns or sets the title for a content control. Read/write.

Returns or sets the type for a content control. Read/write.

Returns the mapping of a content control to XML data in the data store of a document. Read-only.

Remarks

Use the method of the ContentControls collection to create a content control. Use the parameter of the Add method to specify the type of content control to create.

Use the property to change the content control to a different type of content control. For example, perhaps you want to change from a date control to a text control. However, you may not be able to change all content controls to another type; some may not allow changing their type. In addition, depending on the contents of a content control, you may not be able to change the type. For example, if the content control that you want to change to does not allow the type of content that is in the existing content control, attempting to change the type is not allowed and generates a run-time error.

Use the method to change the placeholder text from the default string to something more appropriate for the control. Use the property to specify the title text for the control. This displays above the control when the cursor is positioned inside the control or the mouse pointer is positioned over the control.

Depending on the type of content control that you have, you may not be able to use all the properties and methods of the ContentControl object.

Not all content control properties apply to all the different types of content controls. The following table lists which properties apply to which types of content controls.

property BuildingBlock Gallery content controls ()
property BuildingBlock Gallery content controls ()
property Date content controls ()
property Date content controls ()
property Date content controls ()
property Combo box and drop-down list content controls ( and )
property Plain text content controls ()
method Group content controls ()

Использование VisualState

Визуальные состояния определяются и активируются элементом управления. Например, при наведении указателя мыши на элемент управления активируется состояние . Изменения свойств можно анимировать на основе текущего состояния элемента управления. В предыдущем разделе с помощью <PropertyTrigger> фон кнопки изменялся на , когда свойство получало значение . Теперь вместо этого создайте визуальное состояние, которое анимирует изменение этого цвета, обеспечивая плавный переход. Дополнительные сведения об элементе VisualStates см. в разделе .

Чтобы преобразовать <PropertyTrigger> в анимированное визуальное состояние, сначала удалите элемент <ControlTemplate.Triggers> из вашего шаблона.

Затем в разделе <Grid> шаблона элемента управления добавьте элемент <VisualStateManager.VisualStateGroups> с <VisualStateGroup> для . Определите два состояния — и .

Все анимации, определенные в <VisualState> , применяются при активации соответствующего состояния. Создайте анимации для каждого состояния. Анимации помещаются в элемент <Storyboard> . Дополнительные сведения о раскадровках см. в статье Общие сведения о Storyboard.

  • Норм.

    Это состояние анимирует заливку эллипса, восстанавливающую цвет элемента управления.

  • MouseOver

    Это состояние анимирует изменение цвета эллипса на новый цвет: .

<ControlTemplate> будет иметь следующий вид.

Запустите проект

Обратите внимание, что при наведении мыши на кнопку цвет анимируется

Внедряем/используем User Control

С приведенным выше кодом, все, что нам нужно — это поместить наш Control в окно. Для этого нужно добавить ссылку на пространство имен с созданным UserControl сверху XAML-кода вашего окна:

После этого мы можем использовать префикс uc в нашем окне, как если бы это был любой другой контрол:

Обратите внимание, что мы используем свойства Title и MaxLength прямо в XAML-коде. Вот полный пример кода вашего окна:. Теперь весь созданный функционал можно использовать, написав всего лишь строчку кода, как в примере, где у нас два раза используется ограниченный ввод

Конечный результат выглядит так:

Теперь весь созданный функционал можно использовать, написав всего лишь строчку кода, как в примере, где у нас два раза используется ограниченный ввод. Конечный результат выглядит так:

Добавление процедуры проверки достоверности данных

Хотя теперь есть свойство зависимости по имени CurrentNumber, все же анимация в действии не видна. Следующая необходимая поправка, которая может понадобиться, состоит в указании функции для выполнения некоторой логики проверки достоверности. Для целей данного примера предположим, что нужно обеспечить, чтобы значение свойства CurrentNumber находилось в пределах от 0 до 500.

Для этого добавьте финальный аргумент к методу DependencyProperty.Register() типа ValidateValueCallback, указывающий на метод по имени ValidateCurrentNumber.
ValidateValueCallback — это делегат, который может только указывать на методы, возвращающие bool и принимающие object в качестве единственного аргумента. Этот object представляет новое значение, которое присваивается. Реализуйте ValidateCurrentNumber для возврата true, если входящее значение находится в заданном диапазоне, и false — в противном случае:

Добавьте свойства зависимостей Header и HeaderTemplate.

Теперь имитируйте HeaderedContentControl, чтобы добавить свойства Header и HeaderTemplate в MyHeaderedContentControl.

При добавлении свойств к настраиваемым элементам управления следует попытаться использовать зависимые свойства (некоторые свойства, доступные только для чтения, могут использовать свойства среды CLR), поскольку только зависимые свойства могут использоваться в качестве целевого объекта привязки. Создание свойств зависимостей в WPF может быть очень сложным и даже проще: для этого требуется несколько строк кода. Создание свойств зависимостей в настраиваемых элементах управления обычно включает в себя следующие части:

  1. Зарегистрируйте свойство зависимости и сгенерируйте идентификатор свойства зависимости. Идентификатор атрибута зависимости — одинПоле. Имя идентификатора зависимого свойства должно быть «Имя свойства + Свойство». вУкажите значение атрибута по умолчанию в.

  2. Реализуйте оболочки атрибутов. Предоставьте CLR методы доступа get и set для свойств, вызовите GetValue и SetValue в Getter и Setter соответственно, и не должно быть никакого другого настраиваемого кода в Getter и Setter.

  3. Необходимо следить за изменением стоимости недвижимости. Определите метод PropertyChangedCallback в PropertyMetadata.Поскольку этот метод является статическим, вы можете реализовать метод экземпляра с тем же именем (см. Метод OnContentChanged ContentControl).

Приведенный выше код добавляет свойство Header в MyHeaderedContentControl (код для HeaderTemplate аналогичен и не будет записан)

Обратите внимание, что я использую тип объекта. В WPF такие свойства, как Content, Header и Title, предпочтительно являются типами объектов, так что можно использовать не только текст, но и UIElement, например изображения или другие элементы управления.Это просто пустая функция, но не скупитесь на эту строку кода ради производных классов

Значение по умолчанию для свойства зависимости может быть установлено вОбычно он устанавливается в значение по умолчанию для типа атрибута. Его также можно установить в Setter of DefaultStyle. Не рекомендуется устанавливать его в конструкторе.

После добавления свойств зависимости обновите шаблон элемента управления, и элемент управления в основном готов.

Content Control Events

In addition to the properties and methods available with the content control object model in Word, you can also use several events that allow you to run code when adding or removing a content control or when a user edits a content control. The following list describes each of the events and when the event code runs. All of these events are members of the Document object.

Event Name Description
ContentControlAfterAdd Occurs after adding a new content control to a document. This event runs whether the user adds the content control by using the tools in the UI or adds them by using code.
ContentControlBeforeContentUpdate Occurs before Word updates the content in a content control.
ContentControlBeforeDelete Occurs before a user deletes a content control. This event runs whether the user deletes the content control by using the tools in the UI or deletes them by using code.
ContentControlBeforeStoreUpdate Occurs before Word updates the contents of a content control from data in the document’s data store.
ContentControlOnEnter Occurs when a user enters a content control.
ContentControlOnExit Occurs when a user exits a content control.

What Are Content Controls?

Content controls are bounded and potentially labeled regions in a document that serve as containers for specific types of content. Individual content controls can contain content such as dates, lists, or paragraphs of formatted text. In some cases, content controls might remind you of forms. However, they are much more powerful, flexible, and useful because they enable you to create rich, structured blocks of content. Content controls enable you to author templates that insert well-defined blocks into your documents. Content controls enable you to:

  • Specify structured regions in a template. Each structured region has its own unique ID so that you can read from and write to it. Examples of types of structured regions (or content controls) are combo boxes, pictures, text blocks, and calendars.

  • Determine the behavior of content controls. Each content control takes up a portion of a document and, as the template author, you can specify what each region does. For example, if you want a region of your template to be a calendar, you insert a calendar content control in that area of the document, which automatically determines what that block of content does. Similarly, if you want a section of a template to display an image, create a picture content control in that area. In this way, you can build a template with predefined block types.

  • Restrict the ability to modify content controls within a document. Each content control can be restricted, so that it cannot be deleted or edited. This is useful if, for example, you have copyright information in a template that the user should be able to read but not edit. Or, as another example, you can also lock a content control that you have placed within a template document so that a user does not accidentally delete the content contained in the content control. This makes templates more robust than in previous versions.

  • Map the contents of a content control to data in a custom XML part. For example, if you insert plain text content controls into cells of a table of stock prices, you can map the content controls in the table cells to nodes in an XML file that contain the current stock prices. When the prices change, an add-in can programmatically update the attached XML file, which is bound to each plain text content control, and the new, updated prices automatically appear in the table.

The easiest way to create a content control is through the user interface (although you can also create them programmatically). To create a content control through the user interface (UI), select the content that you want to turn into a content control (for example, some text or a picture) and then choose the content control type you want from the content controls section of the Developer ribbon. This creates a content control around the selected content.

Рейтинг
( Пока оценок нет )
Понравилась статья? Поделиться с друзьями:
Все про сервера
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: