Silverlight / WPF: получение размера UIElement после его отображения на экране - PullRequest
1 голос
/ 27 мая 2010

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

            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) чтобы дать мне размер текстового блока.Ни один из них не делает.

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

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

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

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

Ответы [ 2 ]

2 голосов
/ 27 мая 2010

Ниже приведен пример, который добавляет 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>

Код позади:

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);
        }
    }
}
0 голосов
/ 27 мая 2010

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

...