Mám Blazor Server Aplikace s následujícími tagy DIV
<div class=mainScreen id="outerBox" style="width:@(TotalWidth)px;height:@(TotalHeight)px;">
foreach(Device thisDevice in MyDevices)
{
<div class=column id="@MainDiv" style="width:@(thisDevice.Width)px;height:@(thisDevice.Height)px;left:@thisDevice.XCoordinate;top:@thisDevice.YCoordinate">
Main Content Here...
</div>
}
</div>
Pokusil jsem se nastavit Výška, Šířka, a X/Y souřadnic pomocí ukázky kódu z této stránky - https://blazor.tips/blazor-how-to-ready-window-dimensions/ ale, který nikdy nepracoval a jednoduše hodil nezachycená výjimka, bez ohledu na to, kde jsem se umístil Zkusit... bloky.
Pak jsem se přestěhoval do více jednoduchých JS volání:
await Task.Run(async () =>
{
//Commenting out the OnInitializeAsync makes no difference but needs to be commented out when embedded
//On the main component
await this.OnInitializedAsync();
string data = await JSRuntime.InvokeAsync<string>("getMyWindow", new object[] { });
JObject offsets = (JObject)JsonConvert.DeserializeObject(data);
TotalHeight = offsets.Value<int>("height");
TotalHeight = offsets.Value<int>("width");
}
//In my JS file, the function looks as follows:
function getMyWindow() {
var obj = {};
obj.width = window.width;
obj.height = window.height;
return JSON.stringify(obj);
}
Když jsem tento volat přímo v kódu, nic se nestane - i s OnInitializeAsync komentoval.
var result = SetDimensions().Result;
Kdybych místo této metody v OnAfterRendor metoda:
protected override void OnAfterRender(bool firstRender)
{
if (firstRender)
{
if (!SetTheDivs)
SetTheDivs = SetDimensions().Result;
StateHasChanged();
}
}
protected override void OnInitialized()
{
base.OnInitialized();
this.OnAfterRender(true);
}
vše, co visí, dokud jsem zabít projektu. Tam se nikdy žádné chyby, ale kód nikdy se spouští, když jsem místo zarážky na výšku nebo šířku prohlášení.
Dokonce jsem přidal v Asynchronní verzi bezvýsledně:
protected override async Task OnAfterRenderAsync(bool firstRender)
{
if (firstRender)
{
await SetDimensions();
StateHasChanged();
}
}
protected override async Task OnInitializedAsync()
{
await this.OnAfterRenderAsync(true);
}
Stejný výsledek jako všechno visí. Jsem v rozpacích, jak postupovat a já se opravdu mohl použít nějakou pomoc!
Jako bod jasnosti, to je volání JS, že výsledky v hang:
string data = await JSRuntime.InvokeAsync<string>("getMyWindow", new object[] { });
Přidal jsem v nějaké upozornění, ale nikdy spustit:
function getMyWindow() {
var obj = {};
alert("hi");
obj.width = screen.width;
obj.height = screen.height;
alert("ho");
return JSON.stringify(obj);
}
Děkuji za váš čas!
BTW - já jsem změnit double čekají string data = JSRuntime.InvokeAsync<string>("getMyWindow", new object[] { }).Result;
UPDATE: přesunul jsem JS volání mimo čekají úplně a mám chybu:
InvalidOperationException: JavaScript volání interop nemůže být vydáno v této době. To je proto, že součástí je staticky vykreslen. Když předběžného načítání je povoleno, JavaScript interop volání mohou být provedena pouze v OnAfterRenderAsync životního cyklu metoda.
V tomto případě jsem doslova volá metodu z OnAfterRenderAsync metoda:
protected override async Task OnAfterRenderAsync(bool firstRender)
{
await base.OnInitializedAsync();
if (firstRender)
{
await SetDimensions();
StateHasChanged();
}
}