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 ...?

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top