Как получить фактическую ширину и фактическую высоту для элемента управления на платформе WPF

Я готовлю пользовательский элемент управления на платформе WPF, в которой я использую презентатор контента для отображения представления, и я пытаюсь отобразить текст поверх контента презентатора контента, используя элемент управления текстовым блоком. Для данного текста в текстовом блоке я попытался вычислить фактическую ширину и фактическую высоту для текстового блока, используя метод измерения для позиционирования элемента управления текстовым блоком, но он не обеспечивает фактическую ширину и высоту элемента управления текстовым блоком. . Так что элемент управления текстовым блоком не отображается в представлении. Фрагмент кода приведен ниже: this.CustomTextBlock.Measure(new Size(double.PositiveInfinity, double.PositiveInfinity));

Может ли кто-нибудь предложить мне, как рассчитать фактическую ширину и фактическую высоту для элементов управления на платформе WPF, а также объяснить мне, почему метод измерения не обеспечивает фактическую ширину и фактическую высоту для элемента управления на платформе WPF?

Я также прикрепил ссылку для скачивания проекта ниже: ://www.syncfusion.com/downloads/support/directtrac/general/ze/BViewWpf1629602448][DemoProject]


person T.Eswaran    schedule 29.05.2020    source источник
comment
всякий раз, когда вы пытаетесь измерить размеры элементов управления в wpf, очень вероятно, что ваша проблема может быть решена более простым способом... зачем вам вообще нужен размер вашего текстового поля? Почему бы вам просто не использовать динамическое изменение размера родителей? Я не говорю, что нет причин измерять элемент управления, просто говорю, что я никогда не сталкивался с проблемой, которую нельзя было бы легко избежать и лучше решить с помощью динамических макетов...   -  person Denis Schaf    schedule 29.05.2020


Ответы (1)


UIElement.Measure — это метод, который выполняется механизмом компоновки платформы.
Measure выполняется во время первого прохода макета и фактически вычисляет DesiredSize, который используется во втором проходе макета, когда вызывается Arrange. Arrange может использовать (в зависимости от реализации) DesiredSize для размещения своих дочерних элементов. Measure не имеет прямого влияния на фактический размер. Он вычисляет только максимально доступное пространство. Размер, переданный в этот метод, не является обязательным, поскольку он может быть переопределен алгоритмом измерения. Аргумент считается минимальным доступным пространством.

Если вы хотите изменить размер FrameworkElement, установите свойства Width и Height.

Чтобы TextBlock не занимал максимально доступное горизонтальное пространство, просто установите для HorizontalAlignment значение, отличное от значения по умолчанию HorizontalAlignment.Stretch:

<!-- Use Padding to add additional space -->
<TextBlock Text="Minimum sized TextBlock" 
           HorizontalAlignment="Left" />
person BionicCode    schedule 29.05.2020
comment
Теперь я установил ширину и высоту текстового блока из желаемого значения, полученного при вызове метода измерения. Фрагмент кода приведен ниже: this.CustomTextBlock.Measure(new Size(double.PositiveInfinity, double.PositiveInfinity)); this.CustomTextBlock.Width = this.CustomTextBlock.DesiredSize.Width; this.CustomTextBlock.Height = this.CustomTextBlock.DesiredSize.Height;. - person T.Eswaran; 01.06.2020
comment
Моя другая цель - я буду динамически изменять текст текстового блока всякий раз, когда мне нужно, поэтому, когда я обновляю текст, я снова вызываю приведенный выше код, т.е. (вызывая метод измерения) для вычисления желаемого размера для вновь набранного текста. Но в моем случае он снова возвращает тот же желаемый размер, полученный для предыдущего текста. Таким образом, новый текст отображается неправильно. Например, если мой исходный текст равен 1, то, если я обновлю текст до 20 после загрузки элемента управления, я смогу увидеть только 2. Не могли бы вы объяснить, почему метод измерения не вычисляет правильный желаемый размер после изменения текста. - person T.Eswaran; 01.06.2020
comment
Вы пробовали мое решение? TextBlock автоматически изменит размер, чтобы соответствовать тексту. Не используйте для этого UIElement.Measure. - person BionicCode; 02.06.2020
comment
Скажите, пожалуйста, почему метод измерения не вычисляет правильный желаемый размер после изменения текста. : вы явно устанавливаете ширину элемента управления, которая переопределяет значение по умолчанию Auto. Размер элемента управления больше не изменяется автоматически. Вам нужно будет рассчитать новую длину содержимого для каждого входа и соответствующим образом изменить размер. Опять же, не делайте этого. TextBlock уже имеет реализацию, которая делает то же самое. То, что вы делаете, не имеет никакого смысла. Measure — это то, что внутренне выполняет элемент управления для расчета рендеринга. Вам нужно только установить свойство Width. - person BionicCode; 02.06.2020
comment
Следуйте моему примеру. Я все написал в своем ответе. - person BionicCode; 02.06.2020