9
votes

Comment forcer la véritableWidth et l'actualitéHeight à mettre à jour (Silverlight)

I Une grille sur mon Silverlight Control, je ajoute de manière programmable une toile et dans la toile, je charge et affichant une image.

J'ajoute également une rotation à la toile. Le problème est que par défaut, le centrex et la centrale de la rotation est le haut à gauche de la toile. Ce que je veux, c'est que la rotation se produise autour du centre de la toile. p>

Pour ce faire, j'ai essayé de définir le centrex et la centréy de la rotation vers les images réelWidth code> / 2 et actuelheight code> / 2, mais je J'ai découvert que réelWidth code> et actuelHeight code> ne sont pas toujours peuplés, du moins pas tout de suite. Comment puis-je les forcer à me mettre à jour? P>

Même à l'aide de l'événement DownloadProgress sur l'image ne semble pas garantir que lawidth et l'actualitéHeight sont peuplés et ne l'utilisent pas non plus ..Dispatcher.begininvoke () .. . P>

Image imgTest = new Image();
Canvas cnvTest = new Canvas();
Uri uriImage = new Uri("myurl", UriKind.RelativeOrAbsolute);
System.Windows.Media.Imaging.BitmapImage bmpDisplay = new System.Windows.Media.Imaging.BitmapImage(uriImage);

bmpDisplay.DownloadProgress += new EventHandler<System.Windows.Media.Imaging.DownloadProgressEventArgs>(this.GetActualDimensionsAfterDownload);

imgTest.Source = bmpDisplay;
imgTest.Stretch = Stretch.Uniform;
imgTest.HorizontalAlignment = HorizontalAlignment.Center;
imgTest.VerticalAlignment = VerticalAlignment.Center;

cnvTest.Children.Add(imgTest);

this.grdLayout.Children.Add(imgTest);
this.Dispatcher.BeginInvoke(new Action(GetActualDimensions)); 


0 commentaires

3 Réponses :


14
votes

Pour mettre à jour le ActualWidth et d'un d'un FramewradElement Vous devrez appeler updateLayout .


1 commentaires

Travaillé pour moi aussi. Merci.



3
votes

Malheureusement, Calling UpdateLayout ne fonctionne pas toujours selon votre situation.

J'ai eu la chance de faire quelque chose comme: xxx

mais même ce échoue trop souvent.


0 commentaires

1
votes

La méthode la plus fiable que j'ai trouvée est d'utiliser dépendancePropertyDescriptor fort> addvaluchangé strong> d'auditeurs de réelwidth strong> et actuelHeight strong> au lieu de OnlayoutUpDatedatedatedated fort> Pour obtenir des tailles d'éléments après avoir rendu

DependencyPropertyDescriptor descriptor = DependencyPropertyDescriptor.FromProperty(ActualWidthProperty, typeof(StackPanel));
if (descriptor != null)
{
    descriptor.AddValueChanged(uiPanelRoot, DrawPipelines_LayoutUpdated);
}

descriptor = DependencyPropertyDescriptor.FromProperty(ActualHeightProperty, typeof(StackPanel));
if (descriptor != null)
{
    descriptor.AddValueChanged(uiPanelRoot, DrawPipelines_LayoutUpdated);
}


void DrawPipelines_LayoutUpdated(object sender, EventArgs e)
{
    // Point point1 = elementInstrumentSampleVial.TranslatePoint(
    //                new Point(11.0, 15.0), uiGridMainInner);
}


2 commentaires

DépendancePropertyDescriptor n'est pas disponible en Silverlight.


Vous pouvez essayer d'écouter la mise en forme ou créer un délai d'utilisation avec Disternmertimer, mais cela ne garantirait probablement pas les résultats