Авторазмер элементов на основе положения макета - PullRequest
0 голосов
/ 29 апреля 2011

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

Пример: рассмотрим WrapPanel, который содержит только Label с текстом. Если Label положен на WrapPanel в начале новой строки, то все начальные пробелы будут удалены из его текста. Это действительно сделает Label короче.

Единственная мысль, которая знает о том, где именно будет лежать Label, это WrappPanel, которая делает макетирование. Таким образом, один из подходов к этому - это код пользовательского Panel, который переопределяет MeasureOverride и ArrangeOverride и изменяет Label внутри MeasureOverride перед вызовом Measure на Label. Мне это не нравится, потому что:

  1. Это уродливый хак (Panel и особенно MeasureOverride и ArrangeOveride должны размещать только дети, а не менять их).
  2. Я не уверен, но я думаю, что если я изменю Label внутри MeasureOverride, Label вызовет обновление макета в ответ, что приведет к другому (рекурсивному) вызову MeasureOverride (= > бесконечный цикл).

Итак, , пожалуйста, предложите правильный дизайн для этого сценария. Как это сделать? Мне приходит в голову:

  1. Регулярно WrapPanel.
  2. Каждый раз, когда изменяется Width или Height или изменяется какой-либо дочерний элемент (его дочерние элементы могут быть изменены), обновляйте дочерние элементы до вызова MeasureOverride и ArrangeOverride.
  3. В процессе обновления дочерних элементов (2.) нельзя звонить на Measure или Arrange из WrapPanel. Вопрос: Как временно запретить все такие вызовы?

Прежде чем вы предложите мне использовать RichTextBox или TextBlock, чтобы разобраться с пробелами в начале строк, обратите внимание, что Label s и пробелы являются лишь примером - это немного сложнее. Но если я знаю, как правильно решать 'Label s и пробелы', я тоже буду знать, как решить реальную проблему.

Если вы хотите узнать, зачем мне это нужно, взгляните на мой вопрос Создайте редактор гитарных аккордов в WPF и H.B. .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...