In application with heavier styles and a slower machine when items are dragged and swiped it sometimes leads to exception: Cannot animate the 'VerticalOffset' property on a 'Telerik.Windows.Controls.TileViewPanel' using a 'System.Windows.Media.Animation.DoubleAnimationUsingKeyFrames'
Hi guys,
I am investigating a weird scrolling behavior in our app, I have more or less reproduced it in the attached sample app. I say 'more or less' because the little sample doesn't exactly have the same structure as our app but the result looks to be the same as what is happening in our software.
When declaring an unnamed style that targets the RadTileViewItem, scrolling the minimized TileViewItems while have one in the Maximized state, reverts all the minimized ones to their 'Normal' state as well as the one that was maximized. If the RadTileViewItem style is given a Key in the resource dictionary and used explicitly in the TileView's ItemContainerStyle property the scrolling works fine.
Both ways of using the style should, in my opinion, behave exactly the same.
Please take a look.
Thanks.
Reproduced with Implicit Styles with NoXAML binaries only. The workaround is to set a fixed value for the RestoredHeight property of RadTileViewItem
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; } } }
Workaround: Create a custom style which target type is set to TileViewItemHeader and set it to the HeaderStyle property of the TileView. Then in the custom style, set a custom DataTemplate to the HeaderTemplate property. In this template specify a TextBlock and set its Margin property for instance. Available in R3 2017 Official Release Version.
The values are switched. NewState holds the value of OldState. OldState holds the value of NewState
Allow users to dynamically change the DraggingItem
TextBox (or input control) is in LargeContent of FluidContentControl in RadTileViewItem. Validation fails and Red border is shown on the TextBox. TileState is changed then it is Maximized again. Validation fails again but no red border is shown.
Add deferred scrolling support
InvalidOperationException in thrown in design time in certain situations
The Header of the TileViewItems is bound only for the first X tiles, where X is the loadsize of the VirtualQueryableCollectionView
Implement command support for events like TileStateChanged. Allow sending the TileItem, which state is changing, as an argument.
Design time error occurs when setting MinimizedRowHeight
Both events must be raised only once per item. Also, the event arguments of each event must contain a reference to the item that begins/ends its layout change.
Allow users to resize the tiles. Possibly by dragging a left-mouse cursor on the edges of the tiles. This will give flexiblity beyond the 3 fixed size of minimized, maximized, and restored.
DragAndDrop doesn't work in RadTileView on Mac OS with elevated trust and out of browser application