Как сделать стиль wpf

Обновлено: 08.07.2024

Однако, поскольку другие имеют вышеизложенный, возможно, можно использовать BasedOn для выручения Вас. Проверьте следующую часть свободного xaml. В нем Вы будете видеть, что у меня есть основной стиль, который устанавливает свойство, которое существует на базовом классе элемента, к которому я хочу применить два стиля. И, во втором стиле, который основан на основном стиле, я установил другое свойство.

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


Hope это помогает.

Примечание:

Одна вещь в особенности для замечания. Если Вы изменяетесь TargetType во втором стиле (в первом наборе xaml выше) к ButtonBase , два Стиля не становятся прикладными. Однако проверьте следующий xaml ниже для обхождения того ограничения. В основном это означает, что необходимо дать Стилю ключ и сослаться на него с тем ключом.

Муравей и Ivy самостоятельно развертываются к Nexus repo в Apache, таким образом, нет определенно никаких проблем с интеграцией Плюща/Nexus. – Brian Fox 6 June 2010 в 02:16

Но можно расшириться от другого.. смотрите на свойство

WPF/XAML не обеспечивает эту функциональность исходно, но это действительно обеспечивает расширяемость, чтобы позволить Вам делать то, что Вы хотите.

Мы столкнулись с той же потребностью и закончили тем, что создали наше собственное Расширение Разметки XAML (который мы назвали "MergedStylesExtension"), чтобы позволить нам создавать новый стиль из двух других стилей (который, в случае необходимости, мог, вероятно, использоваться многократно подряд для наследования еще большему количеству стилей).

из-за ошибки WPF/XAML, мы должны использовать синтаксис элемента свойства для использования его, но кроме которого это, кажется, работает хорошо. Например,

Можно ли объяснить типы функций, которые делают его устойчивым/настраивающимся на уровне птичьего глаза? – cwash 24 June 2009 в 16:39

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

Как обновление, Sonatype opensourced их LDAP поддерживают для Nexus с этими 1,5 выпусками в начале 2010. – Ophidian 3 May 2010 в 18:40

Можно, вероятно, получить что-то подобное при применении этого к набору объектов при помощи StyleSelector, я использовал это для приближения к подобной проблеме в использовании различных стилей на TreeViewItems в зависимости от связанного типа объекта в дереве. Вам, вероятно, придется изменить класс ниже немного для корректировки к конкретному подходу, но надо надеяться это получит Вас, запустился

, Вы тогда применяете это как так

О, " случай study" на блоге sonatype, как беспристрастный. Почему don' t Вы просто связываются с продуктом и позволяют людям составить свои собственные умы. – Brad 3 September 2009 в 08:11

С этим синтаксисом для Button, использующего RedButtonStyle, свойство Foreground будет установлено на Red, а свойство Margin - на 10.

Эта функция существует в WPF в течение долгого времени, и она новое в Silverlight 3.

WPF и Silverlight используют расширения разметки для предоставления свойствам значений, для получения которых требуется некоторая логика. Расширения разметки легко узнать по фигурным скобкам, окружающим их в XAML. Например, расширение разметки содержит логику для извлечения значения из источника данных и его обновления при возникновении изменений; расширение разметки содержит логику для получения значения из словаря ресурсов на основе ключа. К счастью для нас, WPF позволяет пользователям писать свои собственные расширения разметки. Эта функция пока отсутствует в Silverlight, поэтому решение в этом блоге применимо только к WPF.

Другие написали отличные решения для объединения двух стилей с использованием расширений разметки. Однако, Мне нужно было решение, которое обеспечивало бы возможность объединения неограниченного количества стилей, что немного сложнее.

Написание расширения разметки несложно. Первый шаг - создать класс, производный от MarkupExtension, и использовать атрибут MarkupExtensionReturnType, чтобы указать, что вы хотите, чтобы значение, возвращаемое вашим расширением разметки, было типа Style.

Определение входных данных для расширения разметки

Моя цель состояла в том, чтобы иметь возможность записывать входные данные следующим образом:

Обратите внимание на запятую, разделяющую ключи разных стилей. К сожалению, пользовательские расширения разметки не поддерживают неограниченное количество параметров конструктора, поэтому такой подход приводит к ошибке компиляции. Если бы я знал заранее, сколько стилей я хочу объединить, я мог бы использовать тот же синтаксис XAML с конструктором, принимающим желаемое количество строк:

В качестве обходного пути я решил, что параметр конструктора принимает одну строку, которая задает имена стилей, разделенные пробелами. Синтаксис неплох:

Вычисление вывода расширения разметки

Я начал с создания метода расширения для Style, который знает, как объединить два стиля. Код для этого метода довольно прост:

Показанный выше метод расширения позволяет использовать следующий синтаксис:

Этот синтаксис полезен при условии, что у меня есть экземпляры обоих стилей в ProvideValue. Я не знаю. Все, что я получаю от конструктора, - это список строковых ключей для этих стилей. Если бы в параметрах конструктора была поддержка params, я мог бы использовать следующий синтаксис для получения фактических экземпляров стиля:

Но это не работает. И даже если бы ограничения параметров не существовало, мы, вероятно, столкнулись бы с другим ограничением расширений разметки, где нам пришлось бы использовать синтаксис элемента свойства вместо синтаксиса атрибута для указания статических ресурсов, что является подробным и громоздким (я лучше объясню эту ошибку в предыдущей записи блога ). И даже если бы обоих этих ограничений не существовало, я бы все равно написал список стилей, используя только их имена - он короче и проще для чтения, чем StaticResource для каждого из них.

Решение состоит в том, чтобы создать StaticResourceExtension, используя код. Имея ключ стиля типа string и поставщика услуг, я могу использовать StaticResourceExtension для получения фактического экземпляра стиля. Вот синтаксис:

Теперь у нас есть все части, необходимые для написания метода ProvideValue:

У меня есть много этих стилей в моем коде xaml, и я хотел бы сохранить каждый стиль компонента в дополнительном файле (а не внешнем файле).. например, все стили, связанные с TextBlocks, должны быть в файле TextBlockStyles.xaml

Как мне это сделать в wpf?

Как связать стиль в моем проекте?

ОТВЕТЫ

Ответ 1

Вы используете объединенные ресурсные словари

В вас app.xaml вы будете использовать

или непосредственно в UserControl будет

Вы можете сократить Source=". " до Source="TextBlockStyles.xaml" если файл находится в одной и той же сборке и в корне проекта, или, альтернативно, Source="Styles\TextBlockStyles.xaml" если вы положили ресурсный словарь в папку " Styles .

Ответ 2

В обозревателе решений щелкните правой кнопкой мыши на своем проекте. Выберите " Добавить". После этого нажмите " Словарь ресурсов". Выберите имя и добавьте в свой проект. Открыть App.xaml Добавить этот код в тег приложения

Ответ 3

Случай использования: у вас есть пользовательский элемент управления MyView.xaml с кнопкой. Вы хотите стилизовать кнопку с помощью внешнего файла XAML.

Вернуться к MyView.xaml ("остальная часть элемента управления"):

Ответ 4

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

Допустим есть кнопка. XAML:

Но этот вариант не проходит. А как это можно сделать?

Ответы

Долго пытался разобраться с этим примером. Он что-то так и не заработал. Там какая-то мутная DLL никак не подключается.

И все довольно сложно. По крайней мере - для меня.

Удалось найти другое решение:

Тему можно закрыть.

Все ответы

Долго пытался разобраться с этим примером. Он что-то так и не заработал. Там какая-то мутная DLL никак не подключается.

И все довольно сложно. По крайней мере - для меня.

Удалось найти другое решение:

Тему можно закрыть.

Центры разработки

Обучение

Сообщество

Свяжитесь с нами

Программы

logo

© 2022 Microsoft

In this article, I am going to talk about customizing a ProgressBar control in pure XAML and tracking its actions in the code-behind.

Let see How to create a Custom ProgressBar.

Step 1
Create a WPF Application.

Step 2
First we need to place a regular ProgressBar control on your window.it is look like this

Step 3
Then we need to build a custom ControlTemplate that will be assigned to the existing
ProgresBar control.Create a Style in Window.Resource element,it is look like this


Step 4
Now define the style resources in Progress bar control,it is look like this


Click on Image for Better View

Step 5
In Code Behind,Import the following Namespace,it is look like this


Step 6
Create a object of BackgroundWorker Class in MainWindow Class,it is look like this

BackgroundWorker Class

The BackgroundWorker class allows you to run an operation on a separate, dedicated thread. Time-consuming operations like downloads and database transactions can cause

your user interface (UI) to seem as though it has stopped responding while they are running. When you want a responsive UI and you are faced with long delays associated with such operations, the BackgroundWorker class provides a convenient solution.To execute a time-consuming operation in the background, create a BackgroundWorker and listen for events that report the progress of your operation and signal when your operation is finished.

To set up for a background operation, add an event handler for the DoWork event. Call your time-consuming operation in this event handler. To start the operation, call RunWorkerAsync. To receive notifications of progress updates, handle the ProgressChanged event. To receive a notification when the operation is completed, handle the RunWorkerCompleted event.

Step 8
Call InitializeBackgroundWorker method in MainWindow Constructor,it is look like this

Читайте также: