在 C# XAML 应用程序中显示 PowerBI 磁贴

Displaying a PowerBI tile in a C# XAML app

我正在 this link 查看有关在 Web 应用程序中显示 PowerBI 磁贴的教程。我想在 C# XAML 应用程序中做类似的事情。

我能够检索有关仪表板和磁贴(包括 embedUrl)的所有信息,并且我将 embedUrl 作为源传递到我的 XAML 应用程序中的 WebView 元素,但我没有查看 WebView 中显示的任何内容。

我知道我遗漏了一些东西 - "Step 2 – Submit authentication token" 中提到的部分 - 访问令牌在 JavaScript 函数 postActionLoadTile 中传回的地方。

更具体地说,link 上的示例有一些 HTML/JS 代码,如下所示用于网络应用程序:

iframe.src = embedTileUrl + "&width=" + width + "&height=" + height;

iframe.onload = postActionLoadTile;

// post the auth token to the iFrame. 
function postActionLoadTile() {
    // get the access token.
    accessToken = document.getElementById('MainContent_accessTokenTextbox').value;

    // return if accessToken is empty
    if ("" === accessToken)
        return;

    var h = height;
    var w = width; 

    // construct the push message structure
    var m = { action: "loadTile", accessToken: accessToken, height: h, width: w};
    message = JSON.stringify(m);

    // push the message.
    iframe = document.getElementById('iFrameEmbedTile');
    iframe.contentWindow.postMessage(message, "*");;
}

我正在尝试使用以下代码在 XAML 中做类似的事情:

XAML:

<WebView x:Name="myWebView" FrameDOMContentLoaded="myWebView_FrameDOMContentLoaded"/>

C#:

var str = string.Format(@"<iframe width='{0}' height='{1}' src='{2}'></iframe>", 
            myWebView.ActualWidth - 10,
            myWebView.ActualHeight - 10, 
            struri);

        myWebView.NavigateToString(str);

但我不知道如何超越。我确实在 C# 代码中复制了 JavaScript 代码中发生的所有事情。

如有任何帮助,我们将不胜感激

听起来您已经弄清楚如何获取 OAuth 令牌并为磁贴获取嵌入 URL。

我通过在 WebView 内容中包含一些 JS 脚本并使用 WebView.InvokeScriptAsync 方法调用脚本来完成关于如何执行此操作的基本概念证明。

以下是我的解决方案的要点:https://gist.github.com/itsananderson/14a179174ea65e246ce7

这里是一个简短的总结:

private void SetEmbedUrl(string embedUrl)
{
    myWebView.NavigateToString("<iframe id=\"iFrameEmbedTile\" src =\""
        + embedUrl +
        "\" style=\"width: 400px; height: 405px\"></iframe>" +
        "<script src=\"ms-appx-web:///postActionLoadTile.js\"></script>");
}

private void myWebView_FrameDOMContentLoaded(WebView sender, WebViewDOMContentLoadedEventArgs args)
{
    await myWebView.InvokeScriptAsync("postActionLoadTile", new[] { myTextBox.Text, "400", "400" });
}

这引用了以下 postActionLoadTile.js 文件,您应该将其添加到您的项目中。

function postActionLoadTile(accessToken, h, w) {
  // Generate a message for the iframe
  var m = { action: "loadTile", accessToken: accessToken, height: h, width: w };
  var message = JSON.stringify(m);

  // Push the message to the iframe
  var iframe = document.getElementById('iFrameEmbedTile');
  iframe.contentWindow.postMessage(message, "*");
}