Я работаю над функцией, которая позволит пользователю нажимать на пустую область (например, холст) и добавлять область текста, где они щелкают. После щелчка они могут сразу же отредактировать текст, изменить передний план, размер шрифта и т. Д. Вроде как добавление диапазона текста к слайду PowerPoint.
Мне интересно, какой будет лучший подход для такого контроля. Моя первоначальная мысль была бы о пользовательском элементе управления (наследуемом от Control), который имеет две внутренние TemplateParts: TextBlock и TextBox. У меня будет два визуальных состояния: просмотр и редактирование. У меня будет свойство зависимости строки в пользовательском элементе управления с именем Text, с которым две части шаблона связаны в своих собственных свойствах Text. Когда пользователь нажимает на элемент управления, он переходит в режим редактирования, TextBlock сворачивается и TextBox виден. Когда TextBox теряет фокус, элемент управления переходит в режим просмотра, и TextBlock становится видимым. Когда пользователь редактирует текст в режиме редактирования, свойство Text обновляется, и все привязки отражают новое значение Text.
Меня беспокоит этот подход - количество привязываемых свойств, которые мне придется обернуть. Например, Control имеет свойства Foreground, FontSize и FontFamily. Я хочу, чтобы эти свойства были перенесены в мои два элемента управления части шаблона, потому что они должны отражать то, что пользователь хочет видеть всегда - как в режиме просмотра, так и в режиме редактирования. Например, установка Foreground = Red в пользовательском элементе управления означает, что внутренние TextBox и TextBlock также должны иметь красный передний план. Таким образом, я должен подключить привязки в OnApplyTemplate для каждого свойства для обеих частей шаблона:
public override void OnApplyTemplate(){
// ... stuff ...
var foregroundBinding = new Binding
{
Source = this,
Path = new PropertyPath("Foreground")
};
myTextBox.SetBinding(TextBox.ForegroundProperty, foregroundBinding);
myTextBlock.SetBinding(TextBlock.ForegroundProperty, foregroundBinding);
// repeat for every other property, such as font size,
// font family, width, maxwidth, height, maxheight,
// horizontal alignment, yadda yadda yadda...
}
Учитывая, что, возможно, существуют десятки свойств, которые я бы хотел перенести из своего пользовательского элемента управления в эти внутренние части шаблона, это кажется утомительным подходом, который будет сложно поддерживать - особенно если я изменю свою стратегию для частей шаблона. позже.
Есть ли лучший подход, или я на правильном пути?