У меня есть следующая простая часть кода:
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
?
Ниже приведен пример, который добавляет 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);
}
}
}
Вы пробовали использовать настоящий контейнер, например Grid
вместо Canvas
?
Что, если вы попытаетесь прочитать свойство ActualSize
после измерения с помощью Dispatcher.BeginInvoke
?