You can work this around by setting the PreservePositionWhenMaximized to False and implement custom preserving logic. You can see this approach in the attached project. private bool isManualPositionChanged = false; private Dictionary<RadTileViewItem, int> maximizedItemPositionCache = new Dictionary<RadTileViewItem, int>(); public MainWindow() { InitializeComponent(); this.xTileView.PreviewTileStateChanged += XTileView_PreviewTileStateChanged; } private void XTileView_PreviewTileStateChanged(object sender, Telerik.Windows.Controls.PreviewTileStateChangedEventArgs e) { if (this.isManualPositionChanged) { return; } RadTileViewItem tileViewItem = (RadTileViewItem)e.OriginalSource; var header = tileViewItem.Header; TileViewItemState oldState = e.TileState; TileViewItemState newState = tileViewItem.TileState; if (newState == TileViewItemState.Minimized || newState == TileViewItemState.Restored) { if (maximizedItemPositionCache.ContainsKey(tileViewItem)) { this.isManualPositionChanged = true; tileViewItem.Position = maximizedItemPositionCache[tileViewItem]; this.isManualPositionChanged = false; maximizedItemPositionCache.Remove(tileViewItem); } if (newState == TileViewItemState.Restored) { this.isManualPositionChanged = true; var tileView = sender as RadTileView; foreach (RadTileViewItem item in tileView.Items) { if (item.TileState == TileViewItemState.Maximized) { item.TileState = TileViewItemState.Restored; } } this.isManualPositionChanged = false; } } else if (newState == TileViewItemState.Maximized) { if (!maximizedItemPositionCache.ContainsKey(tileViewItem)) { maximizedItemPositionCache[tileViewItem] = tileViewItem.Position; } } }