2010-01-24 9 views
0

Предположим, что я показываю растровое изображение и хочу, чтобы текст был помещен на это растровое изображение. Я могу отобразить элемент управления RichEdit или TextBox в местоположении и разрешить ввод текста на определенный шрифт/размер и т. Д., Но затем пользователь может «видеть» прямоугольный элемент управления текстом, который появляется и исчезает при вводе/редактировании и отмена отмены. Он также охватывает растровое изображение при вводе/редактировании текста. Мой вопрос: как это делается, чтобы окно управления текстовыми вводами было «прозрачным» или «невидимым»..NET графический ввод текста

Опять же, если есть текст на растровом изображении, пользователь нажимает на текст и вуаля каретка появляется в тексте, без отображения видимого прямоугольное управления, как текстовое поле, RichEdit и т.д ..., текст просто " магически "становится редактируемым.

Есть ли способ сделать это «прозрачным фоном» в .NET?

ответ

0

Несколько вариантов приходят на ум:

  • Это не может быть плохо, чтобы показать окно ввода текста. Это позволяет пользователю понять, что нажав на растровое изображение, они ввели новый «режим» и теперь могут вводить текст. Это согласуется с редактированием имен элементов в древовидной структуре или, например, для редактирования имени файла в проводнике файлов Windows.

  • TextBox поддерживает BorderStyle.None, но не допускает прозрачный фон (предположительно потому, что он должен был сохранить фон во время операций редактирования). Легко дать понять, работает ли он достаточно хорошо для ваших нужд.

  • Было бы очень легко написать точное поведение, которое вы хотите, на свой дисплей, т. Е. Полностью отказаться от сторонних элементов управления. Вам просто нужно визуализировать текст, а во время редактирования добавить в отображение каретки (т. Е. Нарисуйте простую строку в позиции вставки) и обработать нажатия клавиш для добавления или удаления текста в позиции каретки. Вам просто нужно отделить рендеринг текста и фона, чтобы вы могли повторно отобразить его при изменении текста.

+0

Некоторые интересные мысли. Спасибо Джейсону. – 2010-01-24 22:00:10

0

Простой способ сделать это - использовать элемент управления TextBox WPF. Вы можете легко установить фон прозрачным:

<TextBox Text="{Binding MyProperty}" Background="Transparent" /> 

Для того, чтобы все текстовое поле прозрачным для его содержания, за исключением, просто использовать ControlTemplate:

<TextBox Text="{Binding MyProperty}"> 
    <TextBox.Template> 

    <ControlTemplate> 
     <ScrollViewer Name="PART_ContentHost" /> 
    </ControlTemplate> 

    </TextBox.Template> 
</TextBox> 

Если вы все еще используете WinForms гораздо сложно. У вас есть три варианта:

  • Это звучит как тип приложения, которое вы делаете, это уже большой кандидат в WPF, так что я бы определенно перейти на WPF, если вы не слишком далеко в нее. Помимо прозрачных текстовых полей, WPF имеет много других преимуществ перед WinForms, которые могут резко повысить производительность вашего разработчика, такую ​​как расширенная привязка данных и шаблонирование.

  • Если вы застряли в WinForms, но можете визуализировать область позади TextBox в WPF, используйте WPF ElementHost, чтобы отобразить весь раздел пользовательского интерфейса с использованием WPF и оставить остальную часть вашего кода как WinForms.

  • В противном случае написать собственное управление заменой TextBox, вероятно, лучшее, что вы можете сделать.

0

Одним из способов было бы создать новый пользовательский элемент управления путем наследования от TextBox и затем переопределение метода OnPaint? Я бы использовал .NET Reflector, чтобы посмотреть, что происходит в исходном методе, и попытаться выяснить, как визуализировать текст без фона/фрейма.

Смежные вопросы