Silverlight/WPF: Retreiving размер UIElement, после того как это было представлено на экране

У меня есть следующая простая часть кода:

            var canvas = new Canvas();

            foreach (var ztring in strings)
            {
                var textblock = new TextBlock();
                textblock.Text = ztring;

                panel.Children.Add(textblock);

                textblock.Measure(infiniteSize);
            }

В этой точке я ожидал бы, что любое из свойств размера (Высота/Ширина, ActualHeight/ActualWidth, DesiredSize, RenderSize) даст мне размер textblock. Ни один из них не делает.

ActualHeight всегда дает 16.0 какой шрифт размера. ActualWidth изменения согласно текстовой длине, но не размеру шрифта.

Я изменяю размер шрифта на родительском контейнере а не TextBlock самостоятельно.

Я чувствую, что пропускаю некоторый основной элемент понимания управления элементами Silverlight из codebehind.

Вопрос: как я получаю реальный размер фактического пикселя моего TextBlock?

1
задан David Perlman 26 May 2010 в 21:28
поделиться

2 ответа

Ниже приведен пример, который добавляет TextBlock к Canvas, используя код позади, и когда TextBlock рендерится, он отображает его высоту в заголовке окна. Это то, что вы ищете?

XAML:

<Window x:Class="HeightTest.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Height="300" Width="300">
    <StackPanel TextBlock.FontSize="30">
        <Canvas Name="_canvas" Height="200"/>
    </StackPanel>
</Window>

Code behind:

using System.Windows;
using System.Windows.Controls;

namespace HeightTest
{
    public partial class Window1 : Window
    {
        public Window1()
        {
            InitializeComponent();

            TextBlock textBlock = new TextBlock();
            textBlock.Text = "Hello";
            Canvas.SetLeft(textBlock, 25);
            textBlock.Loaded += 
                (sender, e) => 
                {
                    Title = textBlock.ActualHeight.ToString();
                };
            _canvas.Children.Add(textBlock);
        }
    }
}
2
ответ дан 3 September 2019 в 00:17
поделиться

Вы пробовали использовать настоящий контейнер, например Grid вместо Canvas ? Что, если вы попытаетесь прочитать свойство ActualSize после измерения с помощью Dispatcher.BeginInvoke ?

0
ответ дан 3 September 2019 в 00:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: