подход для пользовательского управления редактированием текста на месте WPF - PullRequest
1 голос
/ 05 марта 2011

Я работаю над функцией, которая позволит пользователю нажимать на пустую область (например, холст) и добавлять область текста, где они щелкают. После щелчка они могут сразу же отредактировать текст, изменить передний план, размер шрифта и т. Д. Вроде как добавление диапазона текста к слайду 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...
}

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

Есть ли лучший подход, или я на правильном пути?

Ответы [ 3 ]

1 голос
/ 05 марта 2011

зачем вам оба, TextBlock и TextBox? Из того, что вы говорите, одного TextBox будет достаточно. Вы бы применили стиль, который имеет несколько триггеров, которые изменяют внешний вид в зависимости от IsKeyboardFocused .

1 голос
/ 27 июня 2011

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

1 голос
/ 05 марта 2011

Может быть проще создать UserControl в XAML с определенными TextBox и TextBlock, привязанными либо к пользовательскому DependencyObject, либо к свойствам зависимостей, которые вы помещаете в код UserControl.Оба элемента управления могут связываться с одинаковыми свойствами.Установите видимость TextBox как свернутую в режиме просмотра и установите ее видимой в режиме редактирования.Обязательно сфокусируйте курсор мыши в TextBox, когда он изначально находится в режиме редактирования.Если хотите, я могу дать более подробную информацию, но сейчас я набираю это со смартфона.

...