2013-02-23 2 views
1

У меня есть ViewBox с изображением внутри:XAML: доступ к фактической ширине и высоте

<Viewbox MaxHeight="100" MaxWidth="100" x:Name="Scenario4ImageContainer2" Stretch="Uniform" Grid.Column="1" Grid.Row="1"> 
    <Image x:Name="Scenario4Image" PointerPressed="Scenario4Image_PointerPressed" HorizontalAlignment="Stretch" /> 
</Viewbox> 

Я хочу, чтобы иметь возможность захватить фактические значения ширины/высоты, но когда я пытаюсь это в бэкенд C#:

int w = (int)Scenario4ImageContainer.Width 

Я получаю сообщение об ошибке, когда параметр неверен.

Это уходит, если я жестко задаю ширину, но я хочу, чтобы она динамически изменялась.

Я также попытался захватить Scenario4ImageContainer.ActualWidth, но этот параметр был «неправильным».

+1

Когда вы попробовали ActualWidth? Является ли контроль уже активным и выложен? Ширина неверна, потому что это NaN, пока вы не установите ее вручную, но ActualWidth не должен быть NaN. – ixSci

+0

@ixSci: «Является ли контроль уже активным и выложен?» Хм ... Я ссылаюсь на эти параметры в конструкторе. При явной установке ширины и высоты значения отображаются так, как ожидалось. – micahhoover

+2

попытайтесь ссылаться на него, когда он выложен точно. Я считаю, что ** Loaded ** - хороший кандидат на это. – ixSci

ответ

0

На каждую ничью я делаю быструю проверку, чтобы убедиться, что контейнер размер был изменен (с инициализацией 0 в начале, чтобы убедиться, что он поймал первый раз).

if (containerWidth != Output.ActualWidth - 300) 
{ 
    Scenario4ImageContainer.Width = Output.ActualWidth - 300; 
    Scenario4ImageContainer.Height = Output.ActualHeight - 20; 
    containerWidth = Output.ActualWidth - 300; 
} 

Он работает по большей части, но когда класс получает навигацию, и навигации назад у него есть проблема, по некоторым причинам. Вероятно, не имеет отношения.

1

A while назад Я пытался измерить ширину строки. Вы можете попробовать аналогичный механизм для получения измерений.

http://invokeit.wordpress.com/2012/09/19/how-to-measure-rendered-string-dimensions-in-win8dev/

this.tb.FontSize = 20; 
this.tb.Measire(new Size(400, 300)); // assuming that 400x300 is max size of textblock you want 
double currentWidth = this.tb.DesiredSize.Width; 
double currentHeight = this.tb.DesiredSize.Height; 
1

Кажется, я нашел событие, которое нужно обрабатывать: вы должны обращаться с ImageOpened события. Это связано с тем, что изображение извлекается асинхронно, и если вы пытаетесь обработать любое другое событие, есть хороший шанс не загружать изображение в это время, так что фактический размер равен нулю

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