Я пытаюсь изучить WPF, но мне очень сложно понять привязки, "ресурсы" и создание объектов. Мой фон находится в С++/MFC и С# -Winforms.
Мои вопросы:
-
Большинство примеров, которые я вижу в XAML (в MSDN и в двух других прочитанных WPF-книгах), используйте StaticResource в выражении привязки. Связаны ли они каким-либо образом с статическими членами? Или это просто вводящее в заблуждение имя? Когда ссылка делается на какой-либо объект как StaticResource, когда он создается?
-
Насколько я вижу, StaticResources используются с "вещами", определенными в разделе "Ресурсы" приложения/окна/элемента управления и т.д.
Теперь эти разделы "Ресурсы" очень запутывают меня. Что это такое? По моему опыту в MFC это были значки, строки и т.д. Однако, судя по всем примерам, которые я видел, в WPF это, по-видимому, по сути является "свалкой" для (a) все виды определения глобальных объектов в разметке (стили, шаблоны данных и т.д.) (b) все виды глобальных экземпляров объектов в разметке Я прав? Мне это кажется очень грязным. Это, по сути, включает в себя изучение всех видов полу DSL в XAML (для определения стилей, для определения шаблонов данных, для создания объектов и т.д.) И объединения их в одном месте. Я продолжаю думать о чем-то вроде редактирования файла ресурсов (.rc) в MFC вручную. По крайней мере, разделы были хорошо разделены, а синтаксис для каждого ресурса был относительно простым. -
Чтобы связать предыдущие два вопроса: когда я определяю экземпляр объекта в разделе "Ресурсы" , а затем ссылаюсь на него из привязки StaticResource, когда он точно создан? MSDN говорит (в разделе "Как сделать данные доступными для привязки в XAML" ):
один способ сделать объект доступный для привязки - это определить его как ресурс
Однако это не очень понятно. Что они означают? Они означают, что они созданы? Они означают подключение к подсистеме привязки? А когда именно этот объект создан? Из простого примера я увидел, что WPF, похоже, создает этот объект для меня, когда он пытается привязать привязку. И это еще более запутанно.
EDIT: После разъяснения кармическим приемом ниже я все еще смущен тем, как это связано с привязкой. Предположим, что у меня есть в моих ресурсах:
<local:Person x:Key="MyPerson" Name="Title"/>
(где Person - класс с именем Name), а затем в окне:
<TextBlock Text="{Binding Source={StaticResource MyPerson}, Path=Name}"/>
1) Что это делает? Проходит ли он через те же шаги - поиск ресурса, а затем его применение к свойству Text? Создается ли объект MyPerson во время создания окна или позже? 2) Должен ли я использовать механизм привязки для привязки к свойству Name? Не могу я привязаться к нему напрямую, как вы делали это с помощью myBrush? Почему я не могу сделать что-то подобное?
<TextBlock Text="{StaticResource MyPerson, Path=Name}"/>
Это просто близорукость со стороны рамки? Я думаю, что здесь очень мало, но я не могу понять, что...
3) Я попытался использовать DynamicResource, но я очень смущен в каждом шаге, который я сделал. a) Добавлен объект DependencyObject с DependencyProperty над моим единственным классом Window в коде (нужен ли этот DependencyObject?)
public class SomeText : DependencyObject
{
public string Header
{
get { return (string)GetValue(HeaderProperty); }
set { SetValue(HeaderProperty, value); }
}
public static readonly DependencyProperty HeaderProperty =
DependencyProperty.Register("Header", typeof(string), typeof(SomeText), new UIPropertyMetadata(0));
}
b) Добавил экземпляр из него в Windows.Resources(это необходимо для DynamicResource? MSDN, похоже, говорит "нет", но если это так, я не могу понять, как сделать следующий шаг в XAML)
c) Я попробовал оба:
Text="{Binding Source={DynamicResource HeaderText}, Path=Header}"
Который дал мне исключение, и
Text="{DynamicResource HeaderText}"
Но я не мог понять, куда поместить путь к свойству Header.
Это моя пятая или около того попытка поиграть с WPF в последнее время, и каждый раз, когда я нахожусь в тупике по этим, казалось бы, простым вещам, которые не работают. Я прочитал 2 книги, и я действительно пытаюсь понять статьи MSDN, однако они вообще не помогают.