Code Snippet
using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Controls.Primitives;
using System.Windows.Media;
namespace ScrollTest
{
public class testPanel:Panel,IScrollInfo
{
private Size _extent = new Size(0, 0);
private Size _viewport = new Size(0, 0);
private Point _offset;
private ScrollViewer _owner;
private TranslateTransform _trans = new TranslateTransform();
public testPanel()
{
this.RenderTransform = _trans;
}
protected override Size MeasureOverride(Size availableSize)
{
double yOffset = 0;
foreach (UIElement child in InternalChildren)
{
child.Measure(availableSize);
yOffset += child.DesiredSize.Height;
}
_extent = new Size(availableSize.Width, yOffset);
_viewport = availableSize;
if(_owner != null)
_owner.InvalidateScrollInfo();
return base.MeasureOverride(availableSize);
}
protected override Size ArrangeOverride(Size finalSize)
{
double yOffset = 0;
foreach (UIElement child in InternalChildren)
{
Rect rc = new Rect(0, yOffset, child.DesiredSize.Width, child.DesiredSize.Height);
child.Arrange(rc);
yOffset += child.DesiredSize.Height;
}
return base.ArrangeOverride(finalSize);
}
#region IScrollInfo Members
bool canHScroll = false;
public bool CanHorizontallyScroll
{
get
{
return canHScroll;
}
set
{
canHScroll = value;
}
}
bool canVScroll = true;
public bool CanVerticallyScroll
{
get
{
return canVScroll;
}
set
{
canVScroll = value;
}
}
public double ExtentHeight
{
get { return _extent.Height; }
}
public double ExtentWidth
{
get { return _extent.Width; }
}
public double HorizontalOffset
{
get { return _offset.X; }
}
public void LineDown()
{
SetVerticalOffset(this.VerticalOffset + 1);
}
public void LineLeft()
{
throw new NotImplementedException();
}
public void LineRight()
{
throw new NotImplementedException();
}
public void LineUp()
{
SetVerticalOffset(this.VerticalOffset - 1);
}
public Rect MakeVisible(Visual visual, Rect rectangle)
{
throw new NotImplementedException();
}
public void MouseWheelDown()
{
throw new NotImplementedException();
}
public void MouseWheelLeft()
{
throw new NotImplementedException();
}
public void MouseWheelRight()
{
throw new NotImplementedException();
}
public void MouseWheelUp()
{
throw new NotImplementedException();
}
public void PageDown()
{
throw new NotImplementedException();
}
public void PageLeft()
{
throw new NotImplementedException();
}
public void PageRight()
{
throw new NotImplementedException();
}
public void PageUp()
{
throw new NotImplementedException();
}
public ScrollViewer ScrollOwner
{
get { return _owner; }
set { _owner = value; }
}
public void SetHorizontalOffset(double offset)
{
throw new NotImplementedException();
}
public void SetVerticalOffset(double offset)
{
if (offset < 0 || _viewport.Height >= _extent.Height)
{
offset = 0;
}
else
{
if (offset + _viewport.Height >= _extent.Height)
{
offset = _extent.Height - _viewport.Height;
}
}
_offset.Y = offset;
if (_owner != null)
_owner.InvalidateScrollInfo();
_trans.Y = -offset;
}
public double VerticalOffset
{
get { return _offset.Y; }
}
public double ViewportHeight
{
get { return _viewport.Height; }
}
public double ViewportWidth
{
get { return _viewport.Width; }
}
#endregion
}
}