2010-05-26 28 views
1

,我有以下簡單的代碼:的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)給我的文本塊的大小。他們都沒有。

ActualHeight總是給出16.0不管字體大小。 ActualWidth根據文本長度而不是字體大小而改變。

我更改父容器的字體大小,而不是TextBlock本身。

我覺得我缺少一些基本元素來理解從代碼隱藏內部對silverlight元素的操縱。

現在的問題是:我如何獲得真實的像素尺寸我的TextBlock

+0

1K的觀點,只有一個贊成票?拜託了夥計們! – 2013-10-29 11:12:00

回答

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); 
     } 
    } 
} 
0

您是否嘗試過使用像Grid這樣的實際容器而不是Canvas? 如果您在測量後使用Dispatcher.BeginInvoke讀取ActualSize屬性,該怎麼辦?

+0

我想絕對定位容器內的文本塊。爲此,我使用'Canvas.SetLeft()'。我認爲這不適用於'Grid'。 – 2010-05-26 21:40:52

相關問題