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