2009-04-24 6 views
0

Je suis en train de développer un contrôle personnalisé Silverlight qui "héberge" une instance Flash. La façon dont vous faites cela, bien sûr, est de positionner l'élément HTML en question sur votre instance Silverlight, comme décrit, par exemple, here. Le problème que je rencontre est que lorsque j'utilise la méthode GeneralTransform.Transform() pour obtenir les coordonnées absolues de mon contrôle, afin que je puisse positionner correctement l'élément HTML, l'objet Point retourné a toujours .X = 0 et .Y = 0.Utilisation de TransformToVisual dans Silverlight pour positionner des éléments HTML

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()); 
} 

Je n'ai pas été en mesure de trouver une grande documentation sur la méthode GeneralTransform.Transform(), mais il semble comme je l'utilise correctement. Des pensées sur ce que je fais mal?

Édition 28/04/09: Je n'ai toujours pas trouvé de réponse, mais j'utilise correctement la méthode Transform(). Le problème apparaît uniquement si j'appelle la méthode InitControl() pendant l'événement Page.Loaded. Si j'attends quelques secondes, puis appelez-le (disons) d'un événement Button_Click, le même code fonctionne très bien. Selon les documents de SL, tout doit être correctement mis en place au moment où l'événement Page.Loaded se déclenche, mais ce n'est clairement pas le cas.

Je devrais également noter que de temps en temps, le code ci-dessus fonctionne parfaitement bien, même quand il est appelé à partir de l'événement Page.Loaded. Huh.

Ma solution de contournement jusqu'à présent, pour ce que ça vaut, est de cacher le contrôle pendant quelques secondes après le formulaire se charge, puis montrez-le. C'est un hack moche, mais à moins que quelqu'un ait de meilleures idées ...?

Répondre

0

Cela est dû au fait que RootVisual a un axe 0,0 x/y. Essayez d'utiliser l'élément suivant dans l'arborescence, en général c'est layoutRoot par défaut (en supposant que vous n'avez pas changé son nom, etc.). Cela ou utilisez FindName() pour vous assurer que vous avez une référence directe à la couche que vous souhaitez positionner sur le iFrame.

Scott Barnes/Gestionnaire de produits Rich Platforms/Microsoft.

+0

Merci, Scott. BTW, si MS pourrait éventuellement (s'il vous plaît, s'il vous plaît, s'il vous plaît) obtenir le support de la webcam dans SL 3.0, ce méchant peu d'interaction SL -> JS -> Flash ne serait pas nécessaire. Tout ce que vous pouvez faire pour nous là-dessus? –

+0

C'est définitivement notre liste de caractéristiques. Nous sommes en planification SL4 en ce moment, donc je vais m'assurer que ça se fasse entendre haut et fort! :) –