我希望在我的WP8.1应用中获得图像的实际宽度。在页面已经呈现之前,不能确定宽度(即,为零),并且其他解决方案建议在页面加载的事件中处理这个,如下面的基本示例中所示。但即使在这里,img.ActualWidth
也是零。
如何在呈现网页后立即检索img.ActualWidth
一次?
public sealed partial class MainPage : Page {
public MainPage() {
this.InitializeComponent();
this.NavigationCacheMode = NavigationCacheMode.Required;
this.Loaded += MainPage_Loaded;
}
private void MainPage_Loaded(object sender, RoutedEventArgs e) {
Debug.WriteLine(img.ActualWidth);
}
}
和
<Page
x:Class="Page_Loaded.MainPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:Page_Loaded"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"
Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
<Grid>
<Image x:Name="img" Source="/image.jpg" />
</Grid>
</Page>
答案 0 :(得分:2)
使用SizeChanged事件处理程序。当ActualHeight或ActualWidth属性更改FrameworkElement上的值时会发生。
ActualWidth是计算属性。计算是布局传递的结果,其中对象根据其连续布局父级的逻辑在布局中进行大小调整。
ActualWidth的默认值为0. 如果对象尚未加载且尚未涉及呈现UI的布局传递,则可能会遇到默认值。(在你的情况下会发生这种情况)
由于布局系统的操作,ActualWidth可以对值进行多次或增量报告的更改。如果在布局仍在迭代时获得值,则布局系统可能仍在计算子对象所需的空间度量,父对象的约束等等。由于该值基于实际渲染过程,可能会略微落后于宽度等属性的设置值,这可能是输入更改的基础。
出于ElementName绑定的目的, ActualWidth在更改时不会发布更新(由于其异步和运行时计算的性质)。不要尝试使用ActualWidth作为ElementName绑定的绑定源。 如果您的方案需要基于ActualWidth进行更新,请使用SizeChanged处理程序。
每当对象上的大小(ActualHeight或ActualWidth)发生更改时,SizeChanged 将触发,即在“测量和排列”传递完成后。处理SizeChanged事件的一个原因是查看元素的ActualHeight与ActualWidth的比率是否因为新布局而发生了变化。