#c# #wpf
#c# #wpf
Вопрос:
Я новичок в WPF. Я много читал о WPF и свойствах зависимостей. Мое понимание свойств зависимостей заключается в привязке свойств к XAML (XAML является целевым). Я представил себе программу, в которой единое окно конфигурации управляло бы всеми визуальными элементами остальной части программы (шрифт, размер шрифта, цвета и т.д.).
С моей первой попытки я создал отдельное окно, которое содержало бы все различные параметры конфигурации. Это не удалось, потому что я не смог выяснить, как использовать свойства зависимости в отдельных файлах XAML.
Кроме того, свойства зависимости могут быть зарегистрированы только в классе, который прямо или косвенно реализует класс DependecyObject. Как мне узнать, какие объекты wpf это реализуют? Похоже, что окно этого не делает, но я могу ошибаться. Моя вторая попытка заключалась в том, чтобы зарегистрировать зависимости в верхнем окне, чтобы все визуальное дерево имело к нему доступ. У меня возникали исключения, и единственное, о чем я мог подумать, это то, что window не реализует DependencyObject. (Я могу ошибаться, и визуальное дерево все еще остается для меня загадкой. Я все же учусь)
Итак, теперь я в растерянности. Возможно ли вообще то, что я пытаюсь? Вся цель этого проекта заключалась в том, чтобы помочь мне изучить WPF, и теперь я задаюсь вопросом, должен ли я снизить свои ожидания относительно того, чего я могу достичь с помощью WPF.
Редактировать:
Что за исключение? Что вы пытаетесь сделать? Не могли бы вы вставить какой-нибудь код?
public partial class MainWindow : Window {
public Color BackColor {
get { return (Color)GetValue(BackColorProperty); }
set { SetValue(BackColorProperty, value); }
}
public static readonly DependencyProperty BackColorProperty =
DependencyProperty.Register("BackColor",typeof(Color),typeof(MainWindow),
new UIPropertyMetadata(0));
Похоже, что Color
было причиной исключения. Я изменил его на int
, и исключение не было выдано. Итак, можно ли регистрировать только примитивные типы?
WPF — это платформа, которая поможет вам создавать действительно привлекательные приложения (это включает также печать и т.д.) Что вы пытаетесь сделать? Должно ли это быть частью визуального дерева?
Опять же, этот проект был предназначен только для того, чтобы заставить меня изучить WPF. Моя идея заключалась в создании основного пользовательского интерфейса с разными страницами. Кнопка настройки откроет окно с вариантами изменения шрифта, размера шрифта, цвета фона и т.д. Эти изменения будут применены в основном пользовательском интерфейсе по мере внесения изменений пользователем. Моя проблема заключалась в том, как мне получить доступ к этим свойствам зависимостей за пределами класса конфигурации, где они были зарегистрированы? Как мне создать одно окно, в котором могут быть ползунок и поля со списком, а любой другой класс может получить доступ к этим параметрам конфигурации?
Проще говоря, я хотел бы, чтобы единая конфигурация (шрифты и цвета) каким-то образом наследовалась всеми пользовательскими интерфейсами. И что эта конфигурация может быть изменена и видна пользователю.
Ответ №1:
Кроме того, свойства зависимостей могут быть зарегистрированы только в классе, который прямо или косвенно реализует класс DependecyObject . Как мне узнать, какие объекты wpf это реализуют? Похоже, что окно этого не делает, но я могу ошибаться.
http://msdn.microsoft.com/en-us/library/system.windows.window.aspx
посмотрите на иерархию наследования, в которой реализуется DependecyObject
Моя вторая попытка заключалась в том, чтобы зарегистрировать зависимости в верхнем окне, чтобы все визуальное дерево имело к нему доступ. У меня возникали исключения, и единственное, что я мог сказать, это то, что window не реализует DependencyObject.
Что за исключение? Что вы пытаетесь сделать? Не могли бы вы вставить какой-нибудь код?
Итак, теперь я в растерянности. Возможно ли вообще то, что я пытаюсь? Вся цель этого проекта заключалась в том, чтобы помочь мне изучить wpf, и теперь я задаюсь вопросом, должен ли я снизить свои ожидания относительно того, чего я могу достичь с помощью wpf.
WPF — это платформа, которая поможет вам создавать действительно привлекательные приложения (это включает также печать и т.д.) Что вы пытаетесь сделать? Должно ли это быть частью визуального дерева?
Ответ №2:
Мы не можем решить здесь большую задачу изучения совершенно нового фреймворка и разработки всей вашей программы. Это займет время. Это может быть непросто, но придерживайтесь этого.
Что касается вашего исключения, проблема в том, что таинственный:
UIPropertyMetadata(0)
фактически предоставляет значение по умолчанию для свойства dependency, и это значение должно соответствовать типу, указанному во втором аргументе Register
. Поскольку 0
это целое число, а ваше свойство является Color
, подсистема свойств зависимостей выдает исключение. Вместо этого вы можете использовать:
UIPropertyMetadata(new Color())
или любой другой цвет по умолчанию.
Ответ №3:
Свойства зависимостей — это более новый дизайн, специально созданный для WPF. Одна из проблем, которые они решают, заключается в создании более быстрого разрешения значений свойств, потому что они не используют старые, более медленные методы (прочитайте, почему они были созданы).
Поначалу их трудно понять, потому что не совсем ясно, зачем они нужны, когда есть поддержка интерфейса с именем INotifyPropertyChanged. Но одна из основных причин (среди прочих) заключается в том, что если вы правильно реализуете DependencyProperty, вы сможете изменять значения свойств этого свойства во время разработки в окне свойств! Теперь это очень классная вещь, потому что вы можете очень легко установить все свои свойства по умолчанию таким образом.
Выполнение этого для редактирования свойств во время разработки позволяет вам узнать намного больше о DPS и о том, почему они используются. На самом деле, некоторые предпочитают их везде, поскольку их просто не так сложно закодировать.
DPS также используются при создании пользовательских элементов управления с использованием метода «Универсальной» папки. Именно так сами Microsoft создают все свои элементы управления.
При их использовании следует учитывать некоторые предостережения. Вы не сможете увидеть свойства DPS во время разработки, пока этот конкретный элемент управления не будет содержаться чем-то другим. Другими словами, UserControl с DPS не будет отображать эти Dps в дизайне UserControl. Однако они будут отображаться в элементе управления, который содержит этот пользовательский элемент управления.
DPS обеспечивают максимальный контроль с использованием метаданных, обратных вызовов PropertyChanged, значений по умолчанию, согласованности и других методов, которые дают вам 100% контроль над тем, что они содержат. DP является окончательным средством управления свойствами.
Продолжайте прочесывать Интернет, поскольку там есть тонны статей на эту тему.