2016-10-08 2 views
0

Ich muss die DesiredSize oder ActualHeight/Breite einer Schaltfläche (und Optionsfeld) messen, ohne es tatsächlich in den visuellen Baum zu setzen, aber ich bekomme non-sense Werte zurück. Derselbe Ansatz funktioniert auch beim Messen anderer Steuerelemente wie TextBlock.DesiredSize eines Knopfes und Optionsfelds in UWP XAML

 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 

Ich erhalte 21px Höhe und 0px für Breite zurück. Irgendeine Idee, warum ich 0 für Breite zurückbekomme?

Antwort

0

Ich muss die DesiredSize oder ActualHeight/Breite einer Schaltfläche (und Optionsfeld) messen, ohne sie tatsächlich in den visuellen Baum zu setzen, aber ich bekomme non-sense-Werte zurück.

Wenn Sie einen String-Wert zu Button.Content zuweisen, wird der Wert an der Innenseite TextBlock- durch Bindung in der Laufzeit zugeordnet werden, die nach dem Button.Measure (Sie geschieht dies auf die Seite, indem Sie die Taste sehen und überprüfen Sie die LiveProperty Explorer): enter image description here

So erhalten Sie die falsche gewünschte Größe.

Als Abhilfe können Sie einen Textblock erstellen und diese TextBlock- der Taste zuweisen:

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; 

Dann werden Sie die richtige Größe dieser Taste erhalten.

+0

Danke Elvis! Das funktioniert! –

0

Ich vermute, dass dies nicht möglich ist. Sie messen die Schaltfläche, bevor sie ihre Vorlage geladen hat.

Ich kann nur vorschlagen, so etwas wie dies zu tun:

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

Aber es ist eine Art von Hacky, und die Taste wird bis zu einem späteren Zeitpunkt nicht geladen werden, so dass dieser gesamte Prozess asynchron, die verwalten könnte schwierig sein.

Verwandte Themen