Принудительно повторно выполнить рендеринг части SVG в панели обновлений в асинхронном вызове? - PullRequest
0 голосов
/ 19 декабря 2018

У меня есть веб-формы c # приложение.Есть фигура SVG, которая имеет различные части.Каждая часть соответствует объекту

public class Room
{
    public string uuid { get; set; }
    public string name { get; set; }
}

Я асинхронно вызываю сервис для потоковой передачи данных в приложение, это работает само по себе.Основываясь на каждой точке данных, которую я получаю, мне нужно покрасить часть svg в определенный цвет.

При первоначальном просмотре страницы svg должен отображаться белым цветом, а затем с помощью обратной передачи (кнопка).необходимо начать потоковую передачу с использованием асинхронного метода.

Код кнопки:

protected async void Button1_Click(object sender, EventArgs e)
    {
        foreach (Room room in rooms)
        {
            await Colour(room);
        }
    }

Функция цвета:

//... initialisation of the call
var response = httpClient.SendAsync(request, HttpCompletionOption.ResponseHeadersRead).Result;
var stream = response.Content.ReadAsStreamAsync().Result;

using (var reader = new StreamReader(stream))
{
     while (!reader.EndOfStream)
     {
     var currentLine = reader.ReadLine();
     if (currentLine.Length > 0)
     {
      JObject json = JObject.Parse(currentLine);
      HtmlGenericControl control = (HtmlGenericControl)FindControl(room.name);
      control.Attributes["style"] = "fill: rgb(0, 255, 0);stroke-width:3;stroke:rgb(0,0,0)";
      UpdatePanel1.Update(); //This doesn't do anything
      }
}}

Разметка (прямоугольный идентификатор соответствует room.name):

<asp:UpdatePanel ID="UpdatePanel1" runat="server" UpdateMode="Conditional" ChildrenAsTriggers="true">
<ContentTemplate>
<div> 
<svg  id="svgFloor1" runat="server">
<rect runat="server" id="e206061" style="fill:rgb(255, 255, 255);stroke-width:3;stroke:rgb(0,0,0)" />
<rect runat="server" id="e20604b1" style="fill:rgb(255, 255, 255);stroke-width:3;stroke:rgb(0,0,0)" />
</div>
</ContentTemplate>
</asp:UpdatePanel>

1 Ответ

0 голосов
/ 19 декабря 2018

Оказывается, я не могу вставлять html-обновления в UpdatePanel.Поэтому я добавил таймер и проверял наличие обновлений каждую 1 секунду.Между тем все изменения генерируются как объекты внутри асинхронного вызова.Когда таймер тикает, все они применяются.

static List<Change> changes = new List<Change>();
class Change
    {
        public string control{ get; set; }
        public string style { get; set; }
    }

protected void UpdateTimer_Tick(object sender, EventArgs e)
    {
        foreach (Change c in changes)
        {
            HtmlGenericControl control = (HtmlGenericControl)FindControl(c.room);
            control.Attributes["style"] = c.style;
        }
        changes = new List<Change>();
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...