2

単一の-control を含むUserControlで構成されるを作成しました。GridImage

<UserControl
    x:Class="Album.AlbumPicture"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="using:Album"
    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"
    Width="200"
    Height="200"
    >

    <Grid Width="200" Height="200">
        <Grid.RowDefinitions>
            <RowDefinition></RowDefinition>
        </Grid.RowDefinitions>
        <Grid.ColumnDefinitions>
            <ColumnDefinition></ColumnDefinition>
        </Grid.ColumnDefinitions>
        <Image Name="AlbumPictureImage" Width="200" Height="200" Grid.Column="0" Grid.Row="0"  />
    </Grid>
</UserControl>

これで、既存のImage(から新しく作成された) を取得し、カスタム コントロールにStream割り当てるコンストラクターができました。ImageImage

AlbumPicture::AlbumPicture(Windows::UI::Xaml::Controls::Image^ Image){
InitializeComponent();
this->AlbumPictureImage = Image;
this->Height = 200;
this->Width = 200;
this->state = AlbumPictureState::SWIPE;
this->StartingPoint = Point(0,0);
} 

UserControlmyがレイアウト コンテナに追加されていることを確認するためにBackgroundGrid白の を作成したところ、正常に表示されました。Imageまた、layout-container に直接追加したところ、正しく表示されました。


さて、コンストラクタを次のように変更すると

AlbumPicture::AlbumPicture(Windows::UI::Xaml::Media::ImageSource^ Source){
InitializeComponent();
this->AlbumPictureImage->Source = Source;
this->Height = 200;
this->Width = 200;
this->state = AlbumPictureState::SWIPE;
this->StartingPoint = Point(0,0);
}

すべて正常に動作し、Imageが表示されます。ここでのキャッチは何ですか?

4

2 に答える 2

1

したがって、私は実際には C#/Xaml 開発者ですが、その理由は、新しいイメージへのコントロールの参照を設定しているが、ビジュアル ツリーをまったく更新していないためだと思います。「this.AlbumPictureImage」オブジェクトの参照を変更しているだけかもしれませんが、ビジュアル ツリー (つまり、親/子参照を持つ FrameworkElement) は古い参照を保持しています。

2 番目の例で参照されている Image オブジェクトに実際の画像を読み込む場合、ビジュアル ツリーをまったく変更していない (または変更しようとしていない) ため、コントロールが表示されます。

私の見方では、私が正しければ、2 つの選択肢があります。

  • ビジュアル ツリー自体を変更します。イメージ コントロールの親の子への参照を削除してから、新しいイメージ コントロールを追加します。

  • ツリー内の古いイメージ コントロールのイメージ ソースを、ツリー内の新しいイメージのイメージ ソースに設定します。

最初のものは、特にこれのいずれかが非同期であることを意図している場合、はるかに困難で危険に満ちています。Image コントロールは、ディスパッチャーを使用してイメージ ソースを設定することを認識していると確信しているため、2 番目のオプションについてはそこで説明する必要があります。最初のものでは確実にその保護が得られないため、非同期スレッドに UI アクセスがない場合に備えて、(ディスパッチャを使用して) UI スレッドにマーシャリングする必要があります。

2 番目のオプションも非常に簡単に実装できます。私が言ったように、このコードがひどい、または壊れている場合、私は絶対に謝罪します:

AlbumPicture::AlbumPicture(Windows::UI::Xaml::Controls::Image^ Image){
InitializeComponent();
this->AlbumPictureImage->Source = Image::Source
this->Height = 200;
this->Width = 200;
this->state = AlbumPictureState::SWIPE;
this->StartingPoint = Point(0,0);
} 

ソースが 2 つのコントロールで同じになる可能性があるかどうかはわかりません。そのため、ソースを何らかの方法でデタッチするか、基になるストリームを取得して、ストリーム自体から新しい ImageSource オブジェクトを作成する必要がある場合があります。

良いコーディング!

于 2013-05-07T18:23:13.907 に答える