Usando TransformToVisual em Silverlight para elementos HTML posição
-
16-09-2019 - |
Pergunta
Eu estou no processo de desenvolvimento de um Silverlight controle personalizado que "hosts" uma ocorrência do Flash. A maneira que você faça isso, é claro, é posicionar o elemento HTML em questão sobre sua instância Silverlight, como descrito, por exemplo, aqui . O problema que eu estou correndo em é que, quando eu uso o método GeneralTransform.Transform () para obter as coordenadas absolutas de meu controle, para que eu possa posicionar o elemento HTML corretamente, o objeto Point que é retornado sempre tem .X = 0 e .Y = 0.
public void InitControl(string id)
{
GeneralTransform gt = this.TransformToVisual(Application.Current.RootVisual);
Point localPos = gt.Transform(new Point(_htmlControlLeft, _htmlControlTop));
// Create the containing DIV tag.
HtmlDocument doc = HtmlPage.Document;
divHost = doc.CreateElement("div");
divHost.SetAttribute("id", System.Guid.NewGuid().ToString());
divHost.SetStyleAttribute("position", "absolute");
divHost.SetStyleAttribute("left", localPos.X.ToString() + "px"); // always 0
divHost.SetStyleAttribute("top", localPos.Y.ToString() + "px"); // always 0
Debug.WriteLine("x,y=" + localPos.X.ToString() + "," + localPos.Y.ToString());
divHost.SetStyleAttribute("width", Width.ToString() + "px");
divHost.SetStyleAttribute("height", Height.ToString() + "px");
divHost.SetStyleAttribute("z-index", _htmlZIndex.ToString());
}
Eu não tenho sido capaz de encontrar grande documentação sobre o método GeneralTransform.Transform (), mas parece como eu estou usando-o corretamente. Quaisquer pensamentos sobre o que estou fazendo de errado?
Editar 4/28/09: eu ainda não encontrei uma resposta, mas eu estou usando o método Transform () corretamente. O problema só aparece se eu chamar o método InitControl () durante o evento Page.Loaded. Se eu esperar alguns segundos, em seguida, chamá-lo de (digamos) de um evento Button_Click, o mesmo código funciona bem. De acordo com os docs SL, tudo deve ser definido de forma adequada pelo tempo o evento é acionado Page.Loaded, mas é evidente que não é o caso.
Gostaria também de salientar que de vez em quando, o código acima funciona perfeitamente bem, mesmo quando ele é chamado a partir do evento Page.Loaded. Huh.
Minha solução até agora, para o que vale a pena, é ocultar o controle por alguns segundos depois de o formulário é carregado, então mostrá-lo. É um corte feio, mas a menos que alguém tiver alguma idéia melhor ...?
Solução
Isto é devido ao RootVisual tendo um 0,0 x / eixo y. Tente usar o próximo elemento dentro da árvore, normalmente a sua LayoutRoot por padrão (supondo que você não mudou seu nome etc). Que ou utilizar FindName () para garantir que tem uma referência direta à referida camada que você está querendo colocar o iFrame mais.
Scott Barnes / Plataformas ricos Product Manager / Microsoft.