0

Sharpdx から xaml コントロール say(gird, canvas) のビットマップ イメージまたはメモリ ストリームを作成することは可能ですか。セカンダリ タイルの Pin To Start 機能を実装するために、ウィンドウの 1 つから画像を作成する必要があります。

4

1 に答える 1

-3

Windows.Storage.Streams の RandomAccessStreamReference クラスを使用してビットマップを作成しています。一例 (これは実際には共有用のコードです):

        var reference = RandomAccessStreamReference.CreateFromUri(new Uri(item.ImagePath.AbsoluteUri));
        request.Data.SetBitmap(reference);

また、セカンダリ タイルをピン留めする場合、次のように、ロゴがアプリ パッケージの一部である限り、実際のビットマップを作成せずに、タイルにロゴの URI を渡すことができることに注意してください。

    var uri = new Uri(item.TileImagePath.AbsoluteUri);

    var tile = new SecondaryTile(
            item.UniqueId,              // Tile ID
            item.ShortTitle,            // Tile short name
            item.Title,                 // Tile display name
            item.UniqueId,              // Activation argument
            TileOptions.ShowNameOnLogo, // Tile options
            uri                         // Tile logo URI
        );

    await tile.RequestCreateAsync();

最後に、セカンダリ タイルで使用する画像がアプリ パッケージの一部ではなくオンラインにある場合は、使用する前にローカルにコピーする必要があります。これを行うコードを次に示します。

    // This is the URI that you will then pass as the last parameter into 
    // the Secondary Tile constructor, like the code above:
    var logoUri = await GetLocalImageAsync(restaurant.ImagePath, restaurant.Key);

    // and here's the method that does the meat of the work:

/// <summary>
/// Copies an image from the internet (http protocol) locally to the AppData LocalFolder.
/// This is used by some methods (like the SecondaryTile constructor) that do not support 
/// referencing images over http but can reference them using the ms-appdata protocol.  
/// </summary>
/// <param name="internetUri">The path (URI) to the image on the internet</param>
/// <param name="uniqueName">A unique name for the local file</param>
/// <returns>Path to the image that has been copied locally</returns>
private async Task<Uri> GetLocalImageAsync(string internetUri, string uniqueName)
{
    if (string.IsNullOrEmpty(internetUri))
    {
        return null;
    }

    using (var response = await HttpWebRequest.CreateHttp(internetUri).GetResponseAsync())
    {
        using (var stream = response.GetResponseStream())
        {
            var desiredName = string.Format("{0}.jpg", uniqueName);
            var file = await ApplicationData.Current.LocalFolder.CreateFileAsync(desiredName, CreationCollisionOption.ReplaceExisting);

            using (var filestream = await file.OpenStreamForWriteAsync())
            {
                await stream.CopyToAsync(filestream);
                return new Uri(string.Format("ms-appdata:///local/{0}.jpg", uniqueName), UriKind.Absolute);
            }
        }
    }
}
于 2012-07-24T18:16:10.277 に答える