protected override async Task OnAfterRenderAsync(bool first_render) { if (first_render) { await UpdateColorSwatch(); } if (!UpdatingPicker) { // For some reason, it takes two rounds of updates // to get the controls to line up. So, we set a flag UpdatingPicker = true; DomRect swatch_rect = await DomUtils.GetBoundingClientRect(JS, SwatchId); float pick_x = swatch_rect.left; float pick_y = swatch_rect.top + 50; PickerStyle = "background-color: #444;"; PickerStyle += "width: 200px; height: 200px;"; PickerStyle += "position: fixed;"; PickerStyle += $"left: {pick_x}px;"; PickerStyle += $"top: {pick_y}px;"; StateHasChanged(); } else { UpdatingPicker = false; // Whend the picker is shown for the first time, we register our body click handler if (PickerShown) { PickerShown = false; if (m_net_obj == null) { m_net_obj = DotNetObjectReference.Create(this); } await JS.InvokeAsync <object>("RegisterOutsideClickDetector", PickerId, m_net_obj, "OnOutsideClick"); } } await Log("Swatch OnAfterRenderAsync Finished"); }