2016-10-08 2 views
0

Мне нужно измерить желаемую размерность или фактическую силу/ширину кнопки (и переключателя), не помещая ее на визуальное дерево, но я продолжаю возвращать неосновные значения. Этот же подход работает при измерении других элементов управления, таких как TextBlock.Желаемый размер кнопки и переключателя в 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 

Я возвращаюсь 21px для высоты и 0px для ширины. Любая идея, почему я получаю 0 назад для ширины?

ответ

0

Мне нужно измерить желаемый размер или фактический вес/ширину кнопки (и радиокнопки) без фактического размещения на визуальном дереве, но я продолжаю возвращать неосновные значения.

Если присвоить строковое значение Button.Content, значение будет присвоено внутренней TextBlock через связывание во время выполнения, что происходит после того, как Button.Measure (Вы можете увидеть это, добавив кнопку на страницу и проверьте LiveProperty Explorer): 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

Спасибо Elvis! Это работает! –

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

Но это своего рода Hacky, а кнопка не будет загружаться до некоторого последующего времени, что делает весь этот процесс асинхронный, который может быть трудно управлять.

Смежные вопросы