3 changed files with 0 additions and 141 deletions
@ -1,114 +0,0 @@ |
|||||
using System; |
|
||||
using Avalonia.Controls.Primitives; |
|
||||
using Avalonia.Media; |
|
||||
|
|
||||
namespace Avalonia.Controls.Presenters |
|
||||
{ |
|
||||
public class ThingamybobPresenter : Decorator, IItemsPresenter, IScrollable |
|
||||
{ |
|
||||
private IVirtualizingPanel _panel; |
|
||||
private int _firstIndex; |
|
||||
private int _lastIndex; |
|
||||
|
|
||||
public override void ApplyTemplate() |
|
||||
{ |
|
||||
if (_panel == null) |
|
||||
{ |
|
||||
_panel = new VirtualizingStackPanel(); |
|
||||
Child = _panel; |
|
||||
CheckPanel(); |
|
||||
} |
|
||||
} |
|
||||
|
|
||||
public IPanel Panel => _panel; |
|
||||
|
|
||||
bool IScrollable.IsLogicalScrollEnabled => true; |
|
||||
Action IScrollable.InvalidateScroll { get; set; } |
|
||||
|
|
||||
Size IScrollable.Extent => new Size(1, 100 * AverageItemSize ); |
|
||||
|
|
||||
Vector IScrollable.Offset |
|
||||
{ |
|
||||
get |
|
||||
{ |
|
||||
return new Vector(0, (_firstIndex * AverageItemSize) + (_panel?.PixelOffset ?? 0)); |
|
||||
} |
|
||||
|
|
||||
set |
|
||||
{ |
|
||||
var count = _lastIndex - _firstIndex; |
|
||||
var firstIndex = (int)(value.Y / AverageItemSize); |
|
||||
var firstIndexChanged = _firstIndex != firstIndex; |
|
||||
_firstIndex = firstIndex; |
|
||||
_lastIndex = _firstIndex + count; |
|
||||
_panel.PixelOffset = value.Y % AverageItemSize; |
|
||||
|
|
||||
if (firstIndexChanged) |
|
||||
{ |
|
||||
Renumber(); |
|
||||
} |
|
||||
} |
|
||||
} |
|
||||
|
|
||||
Size IScrollable.Viewport => new Size(1, _panel?.Bounds.Height ?? 0); |
|
||||
Size IScrollable.ScrollSize => new Size(0, 1); |
|
||||
Size IScrollable.PageScrollSize => new Size(0, 1); |
|
||||
|
|
||||
private double AverageItemSize => _panel?.AverageItemSize ?? 1; |
|
||||
|
|
||||
protected override Size ArrangeOverride(Size finalSize) |
|
||||
{ |
|
||||
var result = base.ArrangeOverride(finalSize); |
|
||||
CreateItems(); |
|
||||
((IScrollable)this).InvalidateScroll(); |
|
||||
return result; |
|
||||
} |
|
||||
|
|
||||
private void CreateItems() |
|
||||
{ |
|
||||
var randomColor = Color.FromUInt32( |
|
||||
(uint)(0xff000000 + new Random().Next(0xffffff))); |
|
||||
|
|
||||
while (!_panel.IsFull) |
|
||||
{ |
|
||||
_panel.Children.Add(new TextBlock |
|
||||
{ |
|
||||
Text = "Item " + ++_lastIndex, |
|
||||
Background = new SolidColorBrush(randomColor), |
|
||||
}); |
|
||||
} |
|
||||
} |
|
||||
|
|
||||
private void RemoveItems() |
|
||||
{ |
|
||||
var remove = _panel.OverflowCount; |
|
||||
|
|
||||
_panel.Children.RemoveRange( |
|
||||
_panel.Children.Count - remove, |
|
||||
_panel.OverflowCount); |
|
||||
_lastIndex -= remove; |
|
||||
} |
|
||||
|
|
||||
private void Renumber() |
|
||||
{ |
|
||||
var index = _firstIndex; |
|
||||
|
|
||||
foreach (TextBlock child in _panel.Children) |
|
||||
{ |
|
||||
child.Text = "Item " + ++index; |
|
||||
} |
|
||||
} |
|
||||
|
|
||||
private void CheckPanel() |
|
||||
{ |
|
||||
if (!_panel.IsFull) |
|
||||
{ |
|
||||
CreateItems(); |
|
||||
} |
|
||||
else if (_panel.OverflowCount > 1) |
|
||||
{ |
|
||||
RemoveItems(); |
|
||||
} |
|
||||
} |
|
||||
} |
|
||||
} |
|
||||
@ -1,25 +0,0 @@ |
|||||
using Avalonia.Media; |
|
||||
using System; |
|
||||
using Avalonia.Controls.Primitives; |
|
||||
using Avalonia.Controls.Presenters; |
|
||||
|
|
||||
namespace Avalonia.Controls |
|
||||
{ |
|
||||
public class Thingamybob : Decorator |
|
||||
{ |
|
||||
private ScrollViewer _scrollViewer; |
|
||||
private ThingamybobPresenter _presenter; |
|
||||
|
|
||||
public override void ApplyTemplate() |
|
||||
{ |
|
||||
if (Child == null) |
|
||||
{ |
|
||||
_scrollViewer = new ScrollViewer(); |
|
||||
_presenter = new ThingamybobPresenter(); |
|
||||
_scrollViewer.Content = _presenter; |
|
||||
|
|
||||
Child = _scrollViewer; |
|
||||
} |
|
||||
} |
|
||||
} |
|
||||
} |
|
||||
Loading…
Reference in new issue