3 changed files with 221 additions and 0 deletions
@ -0,0 +1,95 @@ |
|||||
|
using System; |
||||
|
using System.Collections.Generic; |
||||
|
using System.Linq; |
||||
|
using System.Text; |
||||
|
using System.Threading.Tasks; |
||||
|
|
||||
|
namespace Perspex.Controls.Primitives |
||||
|
{ |
||||
|
|
||||
|
public interface IScrollInfoBase |
||||
|
{ |
||||
|
/// <summary>
|
||||
|
/// ScrollOwner is the container that controls any scrollbars, headers, etc... that are dependant
|
||||
|
/// on this IScrollInfo's properties. Implementers of IScrollInfo should call InvalidateScrollInfo()
|
||||
|
/// on this object when properties change.
|
||||
|
/// </summary>
|
||||
|
ScrollViewer ScrollOwner { get; set; } |
||||
|
|
||||
|
Rect MakeVisible(Visual visual, Rect rectangle); |
||||
|
} |
||||
|
|
||||
|
public interface IVerticalScrollInfo : IScrollInfoBase |
||||
|
{ |
||||
|
/// <summary>
|
||||
|
/// VerticalOffset is the vertical offset into the scrolled content that represents the first unit visible.
|
||||
|
/// </summary>
|
||||
|
double VerticalOffset { get; set; } |
||||
|
|
||||
|
/// <summary>
|
||||
|
/// ExtentHeight contains the full vertical range of the scrolled content.
|
||||
|
/// </summary>
|
||||
|
double ExtentHeight { get; } |
||||
|
|
||||
|
/// <summary>
|
||||
|
/// ViewportHeight contains the currently visible vertical range of the scrolled content.
|
||||
|
/// </summary>
|
||||
|
double ViewportHeight { get; } |
||||
|
|
||||
|
/// <summary>
|
||||
|
/// This property indicates to the IScrollInfo whether or not it can scroll in the vertical given dimension.
|
||||
|
/// </summary>
|
||||
|
bool CanVerticallyScroll { get; set; } |
||||
|
|
||||
|
void LineDown(); |
||||
|
|
||||
|
void LineUp(); |
||||
|
|
||||
|
void MouseWheelDown(); |
||||
|
|
||||
|
void MouseWheelUp(); |
||||
|
|
||||
|
void PageDown(); |
||||
|
|
||||
|
void PageUp(); |
||||
|
} |
||||
|
|
||||
|
public interface IHorizontalScrollInfo : IScrollInfoBase |
||||
|
{ |
||||
|
/// <summary>
|
||||
|
/// ExtentWidth contains the full horizontal range of the scrolled content.
|
||||
|
/// </summary>
|
||||
|
double ExtentWidth { get; } |
||||
|
|
||||
|
/// <summary>
|
||||
|
/// ViewportWidth contains the currently visible horizontal range of the scrolled content.
|
||||
|
/// </summary>
|
||||
|
double ViewportWidth { get; } |
||||
|
|
||||
|
/// <summary>
|
||||
|
/// HorizontalOffset is the horizontal offset into the scrolled content that represents the first unit visible.
|
||||
|
/// </summary>
|
||||
|
double HorizontalOffset { get; set; } |
||||
|
|
||||
|
/// <summary>
|
||||
|
/// This property indicates to the IScrollInfo whether or not it can scroll in the horizontal given dimension.
|
||||
|
/// </summary>
|
||||
|
bool CanHorizontallyScroll { get; set; } |
||||
|
|
||||
|
void LineLeft(); |
||||
|
|
||||
|
void LineRight(); |
||||
|
|
||||
|
void MouseWheelLeft(); |
||||
|
|
||||
|
void MouseWheelRight(); |
||||
|
|
||||
|
void PageLeft(); |
||||
|
|
||||
|
void PageRight(); |
||||
|
} |
||||
|
|
||||
|
public interface IScrollInfo : IHorizontalScrollInfo, IVerticalScrollInfo |
||||
|
{ |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,124 @@ |
|||||
|
namespace Perspex.Controls.Primitives |
||||
|
{ |
||||
|
public class ScrollInfoAdapter : IScrollInfo |
||||
|
{ |
||||
|
private readonly IScrollInfoBase nfo; |
||||
|
public ScrollInfoAdapter(IScrollInfoBase nfo) |
||||
|
{ |
||||
|
this.nfo = nfo; |
||||
|
} |
||||
|
|
||||
|
public ScrollViewer ScrollOwner |
||||
|
{ |
||||
|
get { return this.nfo.ScrollOwner; } |
||||
|
set { this.nfo.ScrollOwner = value; } |
||||
|
} |
||||
|
|
||||
|
public double ExtentWidth => (this.nfo as IHorizontalScrollInfo)?.ExtentWidth ?? 0; |
||||
|
|
||||
|
public double ViewportWidth => (this.nfo as IHorizontalScrollInfo)?.ViewportWidth ?? 0; |
||||
|
|
||||
|
public double ExtentHeight => (this.nfo as IVerticalScrollInfo)?.ExtentHeight ?? 0; |
||||
|
|
||||
|
public double ViewportHeight => (this.nfo as IVerticalScrollInfo)?.ViewportHeight ?? 0; |
||||
|
|
||||
|
private double horizontalOffset; |
||||
|
public double HorizontalOffset |
||||
|
{ |
||||
|
get |
||||
|
{ |
||||
|
return (this.nfo as IHorizontalScrollInfo)?.HorizontalOffset ?? this.horizontalOffset; |
||||
|
} |
||||
|
|
||||
|
set |
||||
|
{ |
||||
|
var info = (this.nfo as IHorizontalScrollInfo); |
||||
|
if (info == null) |
||||
|
this.horizontalOffset = value; |
||||
|
else |
||||
|
info.HorizontalOffset = value; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
private double verticalOffset; |
||||
|
public double VerticalOffset |
||||
|
{ |
||||
|
get |
||||
|
{ |
||||
|
return (this.nfo as IVerticalScrollInfo)?.VerticalOffset ?? this.verticalOffset; |
||||
|
} |
||||
|
|
||||
|
set |
||||
|
{ |
||||
|
var info = (this.nfo as IVerticalScrollInfo); |
||||
|
if (info == null) |
||||
|
this.verticalOffset = value; |
||||
|
else |
||||
|
info.VerticalOffset = value; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
public void LineLeft() => (this.nfo as IHorizontalScrollInfo)?.LineLeft(); |
||||
|
|
||||
|
public void LineRight() => (this.nfo as IHorizontalScrollInfo)?.LineRight(); |
||||
|
|
||||
|
public void MouseWheelLeft() => (this.nfo as IHorizontalScrollInfo)?.MouseWheelLeft(); |
||||
|
|
||||
|
public void MouseWheelRight() => (this.nfo as IHorizontalScrollInfo)?.MouseWheelRight(); |
||||
|
|
||||
|
public void PageLeft() => (this.nfo as IHorizontalScrollInfo)?.PageLeft(); |
||||
|
|
||||
|
public Rect MakeVisible(Visual visual, Rect rectangle) => this.nfo.MakeVisible(visual, rectangle); |
||||
|
|
||||
|
public void PageRight() => (this.nfo as IHorizontalScrollInfo)?.PageRight(); |
||||
|
|
||||
|
public void LineDown() => (this.nfo as IVerticalScrollInfo)?.LineDown(); |
||||
|
|
||||
|
public void LineUp() => (this.nfo as IVerticalScrollInfo)?.LineUp(); |
||||
|
|
||||
|
public void MouseWheelDown() => (this.nfo as IVerticalScrollInfo)?.MouseWheelDown(); |
||||
|
|
||||
|
public void MouseWheelUp() => (this.nfo as IVerticalScrollInfo)?.MouseWheelUp(); |
||||
|
|
||||
|
public void PageDown() => (this.nfo as IVerticalScrollInfo)?.PageDown(); |
||||
|
|
||||
|
public void PageUp() => (this.nfo as IVerticalScrollInfo)?.PageUp(); |
||||
|
|
||||
|
private bool canVerticallyScroll; |
||||
|
public bool CanVerticallyScroll |
||||
|
{ |
||||
|
get |
||||
|
{ |
||||
|
return (this.nfo as IVerticalScrollInfo)?.CanVerticallyScroll ?? this.canVerticallyScroll; |
||||
|
} |
||||
|
|
||||
|
set |
||||
|
{ |
||||
|
var info = (this.nfo as IVerticalScrollInfo); |
||||
|
if (info == null) |
||||
|
this.canVerticallyScroll = value; |
||||
|
else |
||||
|
info.CanVerticallyScroll = value; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
private bool canHorizontallyScroll; |
||||
|
public bool CanHorizontallyScroll |
||||
|
{ |
||||
|
get |
||||
|
{ |
||||
|
return (this.nfo as IHorizontalScrollInfo)?.CanHorizontallyScroll ?? this.canHorizontallyScroll; |
||||
|
} |
||||
|
|
||||
|
set |
||||
|
{ |
||||
|
var info = (this.nfo as IHorizontalScrollInfo); |
||||
|
if (info == null) |
||||
|
this.canHorizontallyScroll = value; |
||||
|
else |
||||
|
info.CanHorizontallyScroll = value; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
} |
||||
|
} |
||||
Loading…
Reference in new issue