ho scritto un comportamento per Silverlight/Windows Phone che tratta una situazione simile. L'immagine che devo mostrare può essere più grande o più alta e devo mostrarla in un quadrato.
Il comportamento calcola il rapporto larghezza/altezza sia del contenitore che dell'immagine. A seconda di quale è il più grande/più alto, ridimensiono il controllo Immagine per avere questo effetto di ritaglio con il controllo genitore.
Ecco un esempio di XAML da utilizzare con il mio comportamento.
<Border Height="150" Width="150">
<Image Source="{Binding BitmapImage}" Stretch="UniformToFill"
HorizontalAlignment="Center" VerticalAlignment="Center">
<i:Interaction.Behaviors>
<b:FillParentBehavior />
</i:Interaction.Behaviors>
</Image>
</Border>
Ecco un estratto dal codice C#. Il codice completo può essere trovato qui: FillParentBehavior.cs
double width = this.AssociatedObject.Width;
double height = this.AssociatedObject.Height;
var parentSize = new Size(this.parent.ActualWidth, this.parent.ActualHeight);
var parentRatio = parentSize.Width/parentSize.Height;
// determine optimal size
if (this.AssociatedObject is Image)
{
var image = (Image)this.AssociatedObject;
if (image.Source is BitmapImage)
{
var bitmap = (BitmapImage)image.Source;
var imageSize = new Size(bitmap.PixelWidth, bitmap.PixelHeight);
var imageRatio = imageSize.Width/imageSize.Height;
if (parentRatio <= imageRatio)
{
// picture has a greater width than necessary
// use its height
width = double.NaN;
height = parentSize.Height;
}
else
{
// picture has a greater height than necessary
// use its width
width = parentSize.Width;
height = double.NaN;
}
}
}
this.AssociatedObject.Width = width;
this.AssociatedObject.Height = height;
spiacenti appena ricevuto sul e visto il tuo msg e Stavo andando a caricarlo per testare bu ya questo è quello che mi mancava, dicendogli di fare esattamente questo. Se perdi risoluzione, prova a ritoccare la stessa cosa in un ViewBox. Felice che tu abbia il tuo rimedio, ricordati di segnarlo come risposta. Saluti :) –