專案需以「炫麗」方式展示圖片,嘗試真 3D 僅能做出旋轉立方體,因時程緊迫轉向偽 3D:圖片依橢圓軌道排列並旋轉,配合縮放、透明度變化產生立體感。
x = a * cos(θ), y = b * sin(θ)scale = k / (z + d),z 由 cos(θ) 推導public class ImageInfo : INotifyPropertyChanged
{
public string ImagePath { get; set; }
public double Left { get; set; } // Canvas.Left
public double Top { get; set; } // Canvas.Top
public double Width { get; set; }
public double Height { get; set; }
public double Opacity { get; set; }
public int ZIndex { get; set; }
// INotifyPropertyChanged 實作略
}
ObservableCollection<ImageInfo>,載入圖片路徑。DispatcherTimer 每 50ms 更新角度 θ += Δθ。θ_i = θ + i * (2π / N)。Left、Top、Width、Height、Opacity、ZIndex,觸發屬性通知。<ItemsControl ItemsSource="{Binding Images}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate><Canvas/></ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemContainerStyle>
<Style TargetType="ContentPresenter">
<Setter Property="Canvas.Left" Value="{Binding Left}"/>
<Setter Property="Canvas.Top" Value="{Binding Top}"/>
<Setter Property="Width" Value="{Binding Width}"/>
<Setter Property="Height" Value="{Binding Height}"/>
<Setter Property="Opacity" Value="{Binding Opacity}"/>
<Setter Property="Panel.ZIndex" Value="{Binding ZIndex}"/>
</Style>
</ItemsControl.ItemContainerStyle>
<ItemsControl.ItemTemplate>
<DataTemplate><Image Source="{Binding ImagePath}" Stretch="UniformToFill"/></DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
a, b:橢圓長短軸,控制扁平度minScale, maxScale:最近/最遠縮放比opacityRange:透明度區間timer.Interval:旋轉速度
偽 3D 只需 2D 變換即可達到視覺效果,效能極佳,且數學邏輯清晰易維護。參考了 JavaScript 版本的橢圓排列算法移植而來。