По сути, я хочу выложить визуальные элементы, которые могут изменять свое содержимое в зависимости от места, где они будут размещены. Я хочу сделать это в WPF, но вы можете предложить общий алгоритм, не зная много о WPF.
Пример: рассмотрим WrapPanel
, который содержит только Label
с текстом. Если Label
положен на WrapPanel
в начале новой строки, то все начальные пробелы будут удалены из его текста. Это действительно сделает Label
короче.
Единственная мысль, которая знает о том, где именно будет лежать Label
, это WrappPanel
, которая делает макетирование. Таким образом, один из подходов к этому - это код пользовательского Panel
, который переопределяет MeasureOverride
и ArrangeOverride
и изменяет Label
внутри MeasureOverride
перед вызовом Measure
на Label
. Мне это не нравится, потому что:
- Это уродливый хак (
Panel
и особенно MeasureOverride
и ArrangeOveride
должны размещать только дети, а не менять их).
- Я не уверен, но я думаю, что если я изменю
Label
внутри MeasureOverride
, Label
вызовет обновление макета в ответ, что приведет к другому (рекурсивному) вызову MeasureOverride
(= > бесконечный цикл).
Итак, , пожалуйста, предложите правильный дизайн для этого сценария. Как это сделать? Мне приходит в голову:
- Регулярно
WrapPanel
.
- Каждый раз, когда изменяется
Width
или Height
или изменяется какой-либо дочерний элемент (его дочерние элементы могут быть изменены), обновляйте дочерние элементы до вызова MeasureOverride
и ArrangeOverride
.
- В процессе обновления дочерних элементов (2.) нельзя звонить на
Measure
или Arrange
из WrapPanel
. Вопрос: Как временно запретить все такие вызовы?
Прежде чем вы предложите мне использовать RichTextBox
или TextBlock
, чтобы разобраться с пробелами в начале строк, обратите внимание, что Label
s и пробелы являются лишь примером - это немного сложнее. Но если я знаю, как правильно решать 'Label
s и пробелы', я тоже буду знать, как решить реальную проблему.
Если вы хотите узнать, зачем мне это нужно, взгляните на мой вопрос Создайте редактор гитарных аккордов в WPF и H.B. .