我已按照下面提到的链接在我的应用程序中生成实时图形的图像,它在我的本地计算机上工作正常但是当我在azure上部署它时它没有做任何事情。我得到一个不包含图形的空图像我已经检查了日志没有错误或异常被抛出。它似乎无法在Azure上运行。
我现在可以通过评论以下代码行来重现我当地环境中的问题:
myChart.Update(true,true); //强制图表重绘
viewbox.UpdateLayout();
似乎无法在Azure上更新控件。我还尝试通过“Dispatcher”更新控件,但仍然在Azure上遇到同样的问题。
有人可以帮帮我吗?
答案 0 :(得分:1)
我在我身边创建了一个测试样本,我发现用于生成 LiveChart 图像的代码可以在Azure上的Bot应用程序中运行。
安装在LiveCharts和LiveCharts.Wpf NuGet之后
<package id="LiveCharts" version="0.9.7" targetFramework="net46" />
<package id="LiveCharts.Wpf" version="0.9.7" targetFramework="net46" />
创建Bot应用程序项目并将生成图像的生成代码放在Bot应用程序中 (如果可能,您可以重新创建新的Bot应用程序并测试以下代码检查它是否适合您)
string sfp = "";
private async Task MessageReceivedAsync(IDialogContext context, IAwaitable<object> result)
{
var activity = await result as Activity;
// calculate something for us to return
int length = (activity.Text ?? string.Empty).Length;
sfp = System.Web.HttpContext.Current.Server.MapPath($"~/IMG/chart.png");
Thread STAThread = new Thread(() =>
{
var myChart = new LiveCharts.Wpf.CartesianChart
{
DisableAnimations = true,
Width = 600,
Height = 200,
Series = new SeriesCollection
{
new LineSeries
{
Values = new ChartValues<double> {1, 6, 7, 2, 9, 3, 6, 5}
}
}
};
var viewbox = new System.Windows.Controls.Viewbox();
viewbox.Child = myChart;
viewbox.Measure(myChart.RenderSize);
viewbox.Arrange(new System.Windows.Rect(new Point(0, 0), myChart.RenderSize));
myChart.Update(true, true); //force chart redraw
viewbox.UpdateLayout();
SaveToPng(myChart, "chart.png");
});
STAThread.SetApartmentState(ApartmentState.STA);
STAThread.Start();
STAThread.Join();
await context.PostAsync($"You sent {activity.Text} which was {length} characters1");
context.Wait(MessageReceivedAsync);
}
注意:在我的测试中,我通过Kudu控制台手动创建IMG
文件夹,而不是在代码中创建它。
在网络聊天中测试并向Bot发送消息,然后检查网站文件夹,可以找到通过Kudu Console生成的图片chart.png
<强> chart.png 强>
此外,我使用以下测试代码将图像作为附件发送到客户端,chart.png可以在客户端呈现。
var replymes = context.MakeMessage();
replymes.Attachments.Add(new Attachment()
{
Name = "chart.png",
ContentType = "image/png",
ContentUrl = "https://xxxx.azurewebsites.net/IMG/chart.png"
});
await context.PostAsync(replymes);