我有以下简单的代码:
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
的实际像素大小?
答案 0 :(得分: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>
代码背后:
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);
}
}
}
答案 1 :(得分:0)
您是否尝试使用像Grid
而不是Canvas
这样的真实容器?
如果您尝试使用ActualSize
?
Dispatcher.BeginInvoke
属性,该怎么办?