2 changed files with 132 additions and 0 deletions
@ -0,0 +1,131 @@ |
|||
// Copyright (c) The Perspex Project. All rights reserved.
|
|||
// Licensed under the MIT license. See licence.md file in the project root for full license information.
|
|||
|
|||
using System; |
|||
using Perspex.Input; |
|||
|
|||
namespace Perspex.Controls |
|||
{ |
|||
public class Canvas : Panel, INavigableContainer |
|||
{ |
|||
/// <summary>
|
|||
/// Defines the <see cref="Left"/> property.
|
|||
/// </summary>
|
|||
public static readonly PerspexProperty<double> LeftProperty = |
|||
PerspexProperty.RegisterAttached<StackPanel, Control, double>("Left"); |
|||
|
|||
/// <summary>
|
|||
/// Defines the <see cref="Top"/> property.
|
|||
/// </summary>
|
|||
public static readonly PerspexProperty<double> TopProperty = |
|||
PerspexProperty.RegisterAttached<StackPanel, Control, double>("Top"); |
|||
|
|||
/// <summary>
|
|||
/// Initializes static members of the <see cref="Canvas"/> class.
|
|||
/// </summary>
|
|||
static Canvas() |
|||
{ |
|||
AffectsArrange(LeftProperty); |
|||
AffectsArrange(TopProperty); |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Gets the value of the Left attached property for a control.
|
|||
/// </summary>
|
|||
/// <param name="element">The control.</param>
|
|||
/// <returns>The control's left coordinate.</returns>
|
|||
public static double GetLeft(PerspexObject element) |
|||
{ |
|||
return element.GetValue(LeftProperty); |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Sets the value of the Left attached property for a control.
|
|||
/// </summary>
|
|||
/// <param name="element">The control.</param>
|
|||
/// <param name="value">The left value.</param>
|
|||
public static void SetLeft(PerspexObject element, double value) |
|||
{ |
|||
element.SetValue(LeftProperty, value); |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Gets the value of the Top attached property for a control.
|
|||
/// </summary>
|
|||
/// <param name="element">The control.</param>
|
|||
/// <returns>The control's top coordinate.</returns>
|
|||
public static double GetTop(PerspexObject element) |
|||
{ |
|||
return element.GetValue(TopProperty); |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Sets the value of the Top attached property for a control.
|
|||
/// </summary>
|
|||
/// <param name="element">The control.</param>
|
|||
/// <param name="value">The top value.</param>
|
|||
public static void SetTop(PerspexObject element, double value) |
|||
{ |
|||
element.SetValue(TopProperty, value); |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Gets the next control in the specified direction.
|
|||
/// </summary>
|
|||
/// <param name="direction">The movement direction.</param>
|
|||
/// <param name="from">The control from which movement begins.</param>
|
|||
/// <returns>The control.</returns>
|
|||
IInputElement INavigableContainer.GetControl(FocusNavigationDirection direction, IInputElement from) |
|||
{ |
|||
// TODO: Implement this
|
|||
return null; |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Measures the control.
|
|||
/// </summary>
|
|||
/// <param name="availableSize">The available size.</param>
|
|||
/// <returns>The desired size of the control.</returns>
|
|||
protected override Size MeasureOverride(Size availableSize) |
|||
{ |
|||
availableSize = new Size(double.PositiveInfinity, double.PositiveInfinity); |
|||
|
|||
foreach (Control child in Children) |
|||
{ |
|||
child.Measure(availableSize); |
|||
} |
|||
|
|||
return new Size(); |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Arranges the control's children.
|
|||
/// </summary>
|
|||
/// <param name="finalSize">The size allocated to the control.</param>
|
|||
/// <returns>The space taken.</returns>
|
|||
protected override Size ArrangeOverride(Size finalSize) |
|||
{ |
|||
foreach (Control child in Children) |
|||
{ |
|||
double x = 0.0; |
|||
double y = 0.0; |
|||
double elementLeft = GetLeft(child); |
|||
|
|||
if (double.IsNaN(elementLeft) == false) |
|||
{ |
|||
x = elementLeft; |
|||
} |
|||
|
|||
double elementTop = GetTop(child); |
|||
if (double.IsNaN(elementTop) == false) |
|||
{ |
|||
y = elementTop; |
|||
} |
|||
|
|||
child.Arrange(new Rect(new Point(x, y), child.DesiredSize)); |
|||
} |
|||
|
|||
return finalSize; |
|||
} |
|||
} |
|||
} |
|||
Loading…
Reference in new issue