在C#XAML应用程序中显示PowerBI互动程序

在C#XAML应用程序中显示PowerBI互动程序,c#,xaml,windows-runtime,powerbi,C#,Xaml,Windows Runtime,Powerbi,我正在看关于在web应用程序中显示PowerBI磁贴的教程。我想在C#XAML应用程序中做类似的事情 我能够检索有关仪表板和互动程序的所有信息(包括embedUrl),并将embedUrl作为源传递给XAML应用程序中的WebView元素,但在WebView中看不到任何显示 我知道我遗漏了一些东西——“步骤2–提交身份验证令牌”中提到的部分,其中accesstoken在JavaScript函数postActionLoadTile中传递回 更具体地说,该链接上的示例包含一些HTML/JS代码,如w

我正在看关于在web应用程序中显示PowerBI磁贴的教程。我想在C#XAML应用程序中做类似的事情

我能够检索有关仪表板和互动程序的所有信息(包括embedUrl),并将embedUrl作为源传递给XAML应用程序中的WebView元素,但在WebView中看不到任何显示

我知道我遗漏了一些东西——“步骤2–提交身份验证令牌”中提到的部分,其中accesstoken在JavaScript函数postActionLoadTile中传递回

更具体地说,该链接上的示例包含一些HTML/JS代码,如web应用程序的以下代码:

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

我正尝试使用以下代码在XAML中执行类似的操作:

XAML:


C#:

var str=string.Format(@“”,
myWebView.ActualWidth-10,
myWebView.ActualHeight-10,
斯特拉里);
myWebView.NavigateToString(str);
但我不知道如何超越这一点。我确实在C代码中复制JavaScript代码中发生的所有事情


任何帮助都将不胜感激

听起来您已经知道如何获取OAuth令牌并为磁贴获取嵌入URL

通过在WebView内容中包含一些JS脚本,并使用
WebView.InvokeScriptAsync
方法调用脚本,我建立了一个基本的概念证明

以下是我的解决方案的要点:

下面是一个简短的总结:

private void SetEmbedUrl(字符串embedUrl)
{
myWebView.NavigateToString(“”)+
"");
}
私有无效myWebView\u FrameDOMContentLoaded(WebView发件人、WebViewDOMContentLoadedEventArgs)
{
等待myWebView.InvokeScriptAsync(“postActionLoadTile”,new[]{myTextBox.Text,“400”,“400”});
}
这引用了以下postActionLoadTile.js文件,您应该将其添加到项目中

函数postActionLoadTile(accessToken,h,w){
//为iframe生成消息
var m={action:“loadTile”,accessToken:accessToken,高度:h,宽度:w};
var message=JSON.stringify(m);
//将消息推送到iframe
var iframe=document.getElementById('iframeEmbeddetile');
iframe.contentWindow.postMessage(消息“*”);
}

是否有错误?您的代码准确地发送到服务器的是什么?它的身份验证正确吗?您是否使用Fiddler跟踪结果?首先,在您的Web视图中放置iframe可能没有意义。其次,您没有初始化磁贴。第三,您还没有展示如何检索auth令牌。如果您查看JS代码,它将iframe导航到嵌入URL,然后将消息发布到iframe/窗口,这可能是嵌入代码正在等待的。该消息告诉它要做什么(加载具有特定维度的磁贴),并向其提供身份验证令牌。你好像没那么做。我在评估Power BI。谢谢你发布这个问题。它突出了事情是多么混乱。欢迎使用面向企业开发人员的数据可视化和报告工具,该工具要求您作为企业开发人员完全放弃XAML/VB/C#skillset,恢复到javascript/typescript/css/nodejs,并跳转到与典型的企业应用程序集成。闻起来像是一个不了解客户的人被任命负责Power BI产品开发。这充其量也令人失望。您选择了什么解决方案?您好,我如何使用WebBrowserControl将其移植到Windows窗体应用程序。我试过了。但我什么也没得到
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, "*");;
}
<WebView x:Name="myWebView" FrameDOMContentLoaded="myWebView_FrameDOMContentLoaded"/>
var str = string.Format(@"<iframe width='{0}' height='{1}' src='{2}'></iframe>", 
            myWebView.ActualWidth - 10,
            myWebView.ActualHeight - 10, 
            struri);

        myWebView.NavigateToString(str);