在Windows Phone 8.1中获取实际宽度

时间:2015-03-07 07:28:27

标签: xaml windows-runtime windows-phone-8.1

我希望在我的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>

1 个答案:

答案 0 :(得分:2)

使用SizeChanged事件处理程序。当ActualHeight或ActualWidth属性更改FrameworkElement上的值时会发生。

ActualWidth是计算属性。计算是布局传递的结果,其中对象根据其连续布局父级的逻辑在布局中进行大小调整。

ActualWidth的默认值为0. 如果对象尚未加载且尚未涉及呈现UI的布局传递,则可能会遇到默认值。(在你的情况下会发生这种情况)

由于布局系统的操作,ActualWidth可以对值进行多次或增量报告的更改。如果在布局仍在迭代时获得值,则布局系统可能仍在计算子对象所需的空间度量,父对象的约束等等。由于该值基于实际渲染过程,可能会略微落后于宽度等属性的设置值,这可能是输入更改的基础。

出于ElementName绑定的目的, ActualWidth在更改时不会发布更新(由于其异步和运行时计算的性质)。不要尝试使用ActualWidth作为ElementName绑定的绑定源。 如果您的方案需要基于ActualWidth进行更新,请使用SizeChanged处理程序。

每当对象上的大小(ActualHeight或ActualWidth)发生更改时,

SizeChanged 将触发,即在“测量和排列”传递完成后。处理SizeChanged事件的一个原因是查看元素的ActualHeight与ActualWidth的比率是否因为新布局而发生了变化。