2016-08-26 3 views
1

Я хочу получить высоту элемента управления, который загружается в DataTemplate, когда ширина установлена ​​равной 100. Я использовал приведенный ниже код, но всегда возвращает размер 0,20. Любое предложение по этому поводу?Как рассчитать высоту любого элемента управления, который загружен в DataTemplate?

<DataTemplate x:Name="dataTemplate"> 
    <Grid> 
    <TextBlock Text="{Binding Path=Name}" TextWrapping="Wrap"/> 
    </Grid> 
</DataTemplate> 

var record = new UserInfo() { Name = "ASKL ALASO DKADOLD ADKIKAM AMDKI ADKAI AKDKI" }; 
var contentControl = new ContentControl(); 
contentControl.Measure(new Size()); 
contentControl.Content = record; 
contentControl.ContentTemplate = App.Current.Resources["dataTemplate"] as DataTemplate; 
contentControl.Measure(new Size(100, Double.PositiveInfinity)); 
var size = contentControl.DesiredSize; 

ответ

0

Я использовал следующий код, но всегда возвращает размер 0,20. Любое предложение по этому поводу?

Это потому, что вы не отрендерить ContentControl на макете, вы можете сделать это, например, так:

var record = new UserInfo() { Name = "ASKL ALASO DKADOLD ADKIKAM AMDKI ADKAI AKDKI" }; 

var contentControl = new ContentControl(); 
stackPanel.Children.Add(contentControl); //Add this ContentControl to the childeren collection of a StackPanel to show it 
//contentControl.Measure(new Size()); 
contentControl.Content = record; 
contentControl.ContentTemplate = App.Current.Resources["dataTemplate"] as DataTemplate; 
contentControl.Measure(new Size(100, Double.PositiveInfinity));    
var size = contentControl.DesiredSize; 

Тогда сейчас, вы можете получить размер вашего ContentControl, по моему сторона 94,100.

Я не уверен, что этот размер является тем, который вы действительно хотите, из вашего названия, вы хотите рассчитать высоту любого элемента управления, который загружен в DataTemplate, но этот размер является размером ContentControl, я думаю, что вам нужно это высота Grid, или TextBlock внутри этого ContentControl. Чтобы получить это два управления, вы можете кодировать как это после того, как ContentControl полностью вынесено:

var grid = contentControl.ContentTemplateRoot as Grid; 
var textblock = grid.Children.FirstOrDefault() as TextBlock; 

И следует помнить, что DesiredSize не тонированное размер элемента управления, вы можете обратиться к Замечаний части UIElement.DesiredSize property.