2016-10-08 5 views
0

ボタンやラジオボタンのDesiredSizeやActualHeight/Widthをビジュアルツリーに実際に置くことなく測定する必要がありますが、非センス値は戻ってきます。この同じアプローチは、TextBlockなどの他のコントロールを測定するときに機能します。UWPのボタンとラジオボタンのDesiredSize

 var button = new Button 
     { 
      Content = "Hello World", 
      FontSize = 15 
     }; 

     button.Measure(new Size(maxWidth, double.PositiveInfinity)); 
     var height = button.DesiredSize.Height; 
     var width = button.DesiredSize.Width 

高さは21px、幅は0pxになります。なぜ私は幅のために戻って0を得ているすべてのアイデア?

答えて

0

ボタンやラジオボタンのDesiredSizeやActualHeight/Widthを実際にビジュアルツリーに置くことなく測定する必要がありますが、非センス値は戻ってきます。あなたはButton.Contentに文字列値を割り当てた場合、値は(あなたがページにボタンを追加することで、これを見るとLivePropertyを確認することができますButton.Measure後に発生ランタイムでの結合を介して内部のTextBlockに割り当てられます

エクスプローラ): enter image description here

あなたは間違った希望のサイズを取得します。回避策として

、あなたはのTextBlockを作成して、ボタンにこのTextBlockのを割り当てることができます。

var tbContent = new TextBlock() 
{ 
    Text = "Hello World", 
    FontSize=15 
}; 
var button = new Button 
{ 
    Content = tbContent, 
}; 
var h= button.DesiredSize.Height; 
button.Measure(new Size(200, double.PositiveInfinity)); 
var height = button.DesiredSize.Height; 
var width = button.DesiredSize.Width; 

その後、あなたは、このボタンの正確なサイズを取得します。

+0

ありがとうございました!それは動作します! –

0

私はこれが不可能であると推測しています。テンプレートをロードする前にボタンを測定しています。

var but = new Button(); 
but.Content = "Hello"; 

var popup = new Popup(); 
popup.Child = but; 
popup.IsOpen = true; 
popup.Visibility = Visibility.Collapsed; 

but.Loaded += (s, e) => 
{ 
    System.Diagnostics.Debug.WriteLine(but.RenderSize); 
    popup.IsOpen = false; 
}; 

をしかし、それは一種のハックだし、ボタンは管理が難しいかもしれない、このプロセス全体を非同期になって、しばらく後までロードされません。

私はこのような何かをやって提案することができます。

関連する問題