Hello
I have a problem with onClick event on RadTileElement. After upgrade WinForms to version 2020.3.915.40 i stopped working. Please let me know how is going on.
Regards
Slawek
If i have lots of group, the horizontal axis gets full with the square 4x4 groups, but the vertacal axis has lots of empty space.
I could break the squareness of the groups to make them longer in the vertical axis, but that seems a bit ugly.
However, I cannot seem to find a way to put a group under another group, therefore utilising both the X and Y dimensions well.
Can it be done?
i.e.
--Group 1-- --Group2--
Tile Tile Tile Tile
Tile Tile Tile Tile
--Group 3--
Tile Tile
Tile Tile
Before (How it is now):
After (How I'm proposing it can be):
Workaround: use the attached theme https://docs.telerik.com/devtools/winforms/themes/using-custom-themes
Open the attached project and show the designer. Open the tile's smart tag and try to enter a non numeric symbol for the column and press Enter.
Current: Right-Clicking a RadTileElement in a RadPanorama responds the same as a Left-Click. Request: Right-Click displays a ContextMenu.
To reproduce: 1. Add a RadPanorama with several tiles at design time. 2. Open the RadItem Collection Editor and try to reorder the items by using the arrows. Press OK. As a result, the tiles in the form are not ordered as expected although the order in the Collection Editor is the desired one. Workaround: add the tiles at run-time in the correct order.
To reproduce: public Form1() { InitializeComponent(); this.radPanorama1.ShowGroups = true; TileGroupElement group = new TileGroupElement(); group.Name = "Group1"; this.radPanorama1.Groups.Add(group); for (int i = 0; i < 20; i++) { group.Items.Add(new RadTileElement()); } group.RowsCount = 5; this.radPanorama1.ScrollBarAlignment = HorizontalScrollAlignment.Bottom; } Workaround: set the ScrollBarAlignment property to HorizontalScrollAlignment.Top
To reproduce: 1.Open Demo Hub example and maximize the form. 2.Start dragging "Maginifier" tile. 3. Try to drop it to the last group. You will notice that horizontal scrollbar does not move when the form is maximized. However, it behaves as expected if the form is not maximized. Workaround: public Form1() { InitializeComponent(); this.radPanorama1.PanoramaElement.DragDropService = new CustomService(this.radPanorama1.PanoramaElement); } public class CustomService : TileDragDropService { public RadPanoramaElement OwnerElement { get; set; } public CustomService(RadPanoramaElement owner) : base(owner) { OwnerElement = owner; } public int ScrollStep { get { return (int)typeof(TileDragDropService).GetField("scrollStep", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance).GetValue(this); } set { typeof(TileDragDropService).GetField("scrollStep", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance).SetValue(this, value); } } protected override void HandleMouseMove(Point mousePos) { Point clientPoint = OwnerElement.PointFromScreen(mousePos); Timer scrollTimer = typeof(TileDragDropService).GetField("scrollTimer", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance).GetValue(this) as Timer; if (clientPoint.X > this.OwnerElement.Size.Width - 5) { ScrollStep = (clientPoint.X - this.OwnerElement.Size.Width) + 5; if (!scrollTimer.Enabled) { scrollTimer.Start(); } } else if (clientPoint.X < 5) { ScrollStep = clientPoint.X - 5; if (!scrollTimer.Enabled) { scrollTimer.Start(); } } else { base.HandleMouseMove(mousePos); } } }
To reproduce: public Form1() { InitializeComponent(); this.radPanorama1.RowsCount = 5; this.radPanorama1.ColumnsCount = 1; this.radSpinEditor1.DataBindings.Add("Value", this.radPanorama1, "RowsCount", true, DataSourceUpdateMode.OnPropertyChanged); for (int i = 0; i < 5; i++) { RadTileElement tile = new RadTileElement(); tile.Text = "Tile" + (i ); tile.Row = i ; this.radPanorama1.Items.Add(tile); } } Please refer to the sample video: http://screencast.com/t/lncUvh0vIRKN Workaround: private void radPanorama1_PropertyChanged(object sender, PropertyChangedEventArgs e) { if (e.PropertyName=="RowsCount") { this.radPanorama1.PanoramaElement.InvalidateMeasure(true); } }
It would be nice if the user is allowed to edit the tiles.
To reproduce: Me.RadPanorama1.ShowGroups = True Dim group1 As New TileGroupElement group1.Text = "Group1" Me.RadPanorama1.Groups.Add(group1) group1.ColumnsCount = 3 group1.RowsCount = 5 group1.CellSize = New Size(200, 100) Me.RadPanorama1.Groups.Add(group1) For i = 0 To 2 For j = 0 To 2 Dim tile As New RadTileElement() tile.Row = i tile.Column = j tile.Text = "tile" & i & "." & j group1.Items.Add(tile) Next Next Dim group2 As New TileGroupElement group2.Text = "Group2" Me.RadPanorama1.Groups.Add(group2) group2.ColumnsCount = 3 group2.RowsCount = 5 Me.RadPanorama1.Groups.Add(group1) For i = 0 To 2 For j = 0 To 2 Dim tile As New RadTileElement() tile.Row = i tile.Column = j tile.Text = "tile" & i & "." & j group2.Items.Add(tile) Next Next
To reproduce: Add 2 TileGroupElements to a RadPanorama. Set the rowcount of the first to 2 and to the second one to 1. Add a tile to the first group and set its rowspan to 2. Start the application drag the tile, you will see exception. Workaround: Create a custom TileDragDropService: public class MyTileDragDropService : TileDragDropService { private Action<TileGroupElement, RadTileElement, int> OffsetTiles; private RadPanoramaElement Owner; public MyTileDragDropService(RadPanoramaElement owner) : base(owner) { this.Owner = (RadPanoramaElement)typeof(TileDragDropService).GetField("owner", BindingFlags.Instance | BindingFlags.NonPublic).GetValue(this); MethodInfo matchedMethod = null; foreach (MethodInfo method in typeof(TileDragDropService).GetMethods(BindingFlags.Instance | BindingFlags.NonPublic)) { if (method.Name == "OffsetTiles" && method.GetParameters().Length == 3) { matchedMethod = method; break; } } this.OffsetTiles = (Action<TileGroupElement, RadTileElement, int>)matchedMethod.CreateDelegate(typeof(Action<TileGroupElement, RadTileElement, int>), this); } protected override void HandleGroupedDragDrop(RadDropEventArgs e) { RadTileElement target = e.HitTarget as RadTileElement; RadTileElement source = this.Context as RadTileElement; Point dropLocation = e.DropLocation; if (target != null) { dropLocation = target.PointToControl(dropLocation); } TileGroupElement @group = GetTargetGroup(new RectangleF(dropLocation, source.Size)); if (source == null || @group == null) { return; } Point targetCell = GetTargetCell(@group, dropLocation); if (targetCell.X == -1) { return; } targetCell.X = Math.Abs(Math.Min(targetCell.X, @group.RowsCount - source.RowSpan)); if (targetCell.X >= @group.RowsCount) { targetCell.X = @group.RowsCount - 1; } source.Row = targetCell.X; source.Column = targetCell.Y; if (!@group.Items.Contains(source)) { (source.Parent.Parent as TileGroupElement).Items.Remove(source); @group.Items.Add(source); } int oldColSpan = source.ColSpan; source.ColSpan = 0; this.OffsetTiles(@group, source, oldColSpan); source.ColSpan = oldColSpan; source.Column -= oldColSpan; this.Owner.InvalidateMeasure(true); this.Owner.UpdateLayout(); return; } } And set it to the panorama: panorama.PanoramaElement.DragDropService = new MyTileDragDropService();
To reproduce add a tile and set its ImageIndex before adding images to the ImageList. Here is design time code: // // radTileElement1 // this.radTileElement1.AccessibleDescription = "radTileElement1"; this.radTileElement1.AccessibleName = "radTileElement1"; this.radTileElement1.ImageIndex = 0; this.radTileElement1.Name = "radTileElement1"; this.radTileElement1.Text = "radTileElement1"; this.radTileElement1.Visibility = Telerik.WinControls.ElementVisibility.Visible; // // imageList1 // this.imageList1.ImageStream = ((System.Windows.Forms.ImageListStreamer)(resources.GetObject("imageList1.ImageStream"))); this.imageList1.TransparentColor = System.Drawing.Color.Transparent; this.imageList1.Images.SetKeyName(0, "checkmark.png"); Workaround - put the image list population before the ImageIndex setting in the designer // // imageList1 // this.imageList1.ImageStream = ((System.Windows.Forms.ImageListStreamer)(resources.GetObject("imageList1.ImageStream"))); this.imageList1.TransparentColor = System.Drawing.Color.Transparent; this.imageList1.Images.SetKeyName(0, "checkmark.png"); // // radTileElement1 // this.radTileElement1.AccessibleDescription = "radTileElement1"; this.radTileElement1.AccessibleName = "radTileElement1"; this.radTileElement1.ImageIndex = 0; this.radTileElement1.Name = "radTileElement1"; this.radTileElement1.Text = "radTileElement1"; this.radTileElement1.Visibility = Telerik.WinControls.ElementVisibility.Visible;
ADD. RadPanorama - add save/load layout functionality so one can save and load the tiles size and position
ADD. RadPanorama - add selection support with checkboxes
Currently RadPanorama animates all visible tiles when clicking on a tile.
To reproduce: Add few tiles to a group and subscribe to their MouseLeave event
example: RadLiveTileElement tileElement = new RadLiveTileElement(); tileElement.Text = "&Applications"; tileElement.UseMnemonic = true; panorama.Items.Add(tileElement);