0

Windows 8 アプリで Image 要素の高さを動的に設定しようとしています。これを行うには、ソース イメージの高さを知る必要があります。通常、これは BitmapImage.PixelHeight または BitmapImage.DecodePixelHeight を呼び出すことでアクセスできますが、画像がまだダウンロードされていないため、0 が返されます。次のようにコールバックを設定できます。

image = new BitmapImage(new Uri(link.Url));
System.Diagnostics.Debug.WriteLine("height :" + image.PixelHeight) // returns 0
instance.Source = image;
instance.Height = image.PixelHeight // what I'd like to do, but cant.
image.DownloadProgress += image_DownloadProgress;

static void image_DownloadProgress(object sender, DownloadProgressEventArgs e)
{
    BitmapImage i = (BitmapImage)sender;

    // returns the actual height I need
    System.Diagnostics.Debug.WriteLine("post-download height: " + i.PixelHeight); 
}

そのコールバックで必要な正しいピクセルの高さを取得します。問題は、そのイメージを追加するユーザーコントロールのインスタンスにそれを渡す必要があることです。a.)インスタンスをコールバックの引数に渡してそこで変更できるようにする方法、またはb.)何らかの方法でコールバックなしで高さを非同期に取得する方法はありますか?

4

1 に答える 1

0

この種の問題を解決するために私がやったのは、画像を表示するためのカスタムユーザーコントロールを作成することでした。これは、画像が読み込まれたときにサイズが変更されます。

ここに私のxamlがあります:

<UserControl
    x:Name="userControl"
    x:Class="BoardsForWindows.Controls.BBPostImage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="using:BoardsForWindows.Controls"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d"
    d:DesignHeight="300"
    d:DesignWidth="400">

    <StackPanel Orientation="Vertical">
        <Image x:Name="imageViewer" HorizontalAlignment="Stretch" VerticalAlignment="Stretch"/>
    </StackPanel> 
</UserControl>

そして、これが私の .xaml.cs です (削除されたステートメントを使用):

namespace BoardsForWindows.Controls
{
    public sealed partial class BBPostImage : UserControl
    {
        private BitmapImage bitmapImage;

        public string Source
        {
            get { return (string)GetValue(SourceProperty); }
            set { SetValue(SourceProperty, value); }
        }

        // Using a DependencyProperty as the backing store for Source.  This enables animation, styling, binding, etc...
        public static readonly DependencyProperty SourceProperty =
            DependencyProperty.Register("Source", typeof(string), typeof(BBPostImage), new PropertyMetadata(null, SourceChanged));

        public BBPostImage()
        {
            this.InitializeComponent();
        }

        public static void SourceChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
        {
            BBPostImage image = d as BBPostImage;
            if (image == null)
            {
                return;
            }

            string url = (e.NewValue ?? string.Empty).ToString();
            Uri uri = null;
            if (String.IsNullOrEmpty(url) || !Uri.TryCreate(url, UriKind.Absolute, out uri))
            {
                image.imageViewer.Width = 200;
                image.imageViewer.Height = 40;
                image.imageViewer.Source = null;
                return;
            }

            image.bitmapImage = new BitmapImage();
            image.bitmapImage.ImageFailed += image.bitmapImage_ImageFailed;
            image.bitmapImage.ImageOpened += image.bitmapImage_ImageOpened;
            image.bitmapImage.UriSource = uri;

            image.imageViewer.Source = null;
            image.imageViewer.Source = image.bitmapImage;
        }

        void bitmapImage_ImageOpened(object sender, RoutedEventArgs e)
        {
            Width = bitmapImage.PixelWidth;
            Height = bitmapImage.PixelHeight;
        }

        void bitmapImage_ImageFailed(object sender, ExceptionRoutedEventArgs e)
        {
            // TODO
        }
    }
}
于 2012-11-25T05:28:19.473 に答える