UWP:显示排列成圆圈的 ListView 项目
UWP: Show ListView Items arranged in a circle
我有一个 ListView,其中绑定了 <12 个项目。我想将这些项目排列成一个圆圈,同时仍然能够使用 ListView 功能(selectedItem 等)。不过不需要滚动。
我找到了这个博客 post doing a similar thing in WPF,是否可以重写以在 UWP 中使用?
您提供的 link 应该在 UWP 中工作,这是正确的方法。您只需要这样更新命名空间:
using System;
using Windows.Foundation;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
namespace SomeNamespace
{
public class CircularPanel : Panel
{
protected override Size MeasureOverride(Size availableSize)
{
foreach (UIElement child in Children)
child.Measure(new Size(double.PositiveInfinity, double.PositiveInfinity));
return base.MeasureOverride(availableSize);
}
// Arrange stuff in a circle
protected override Size ArrangeOverride(Size finalSize)
{
if (Children.Count > 0)
{
// Center & radius of panel
Point center = new Point(finalSize.Width / 2, finalSize.Height / 2);
double radius = Math.Min(finalSize.Width, finalSize.Height) / 2.0;
radius *= 0.8; // To avoid hitting edges
// # radians between children
double angleIncrRadians = 2.0 * Math.PI / Children.Count;
double angleInRadians = 0.0;
foreach (UIElement child in Children)
{
Point childPosition = new Point(
radius * Math.Cos(angleInRadians) + center.X,
radius * Math.Sin(angleInRadians) + center.Y);
child.Arrange(new Rect(childPosition, child.DesiredSize));
angleInRadians += angleIncrRadians;
}
}
return finalSize;
}
}
}
我有一个 ListView,其中绑定了 <12 个项目。我想将这些项目排列成一个圆圈,同时仍然能够使用 ListView 功能(selectedItem 等)。不过不需要滚动。
我找到了这个博客 post doing a similar thing in WPF,是否可以重写以在 UWP 中使用?
您提供的 link 应该在 UWP 中工作,这是正确的方法。您只需要这样更新命名空间:
using System;
using Windows.Foundation;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
namespace SomeNamespace
{
public class CircularPanel : Panel
{
protected override Size MeasureOverride(Size availableSize)
{
foreach (UIElement child in Children)
child.Measure(new Size(double.PositiveInfinity, double.PositiveInfinity));
return base.MeasureOverride(availableSize);
}
// Arrange stuff in a circle
protected override Size ArrangeOverride(Size finalSize)
{
if (Children.Count > 0)
{
// Center & radius of panel
Point center = new Point(finalSize.Width / 2, finalSize.Height / 2);
double radius = Math.Min(finalSize.Width, finalSize.Height) / 2.0;
radius *= 0.8; // To avoid hitting edges
// # radians between children
double angleIncrRadians = 2.0 * Math.PI / Children.Count;
double angleInRadians = 0.0;
foreach (UIElement child in Children)
{
Point childPosition = new Point(
radius * Math.Cos(angleInRadians) + center.X,
radius * Math.Sin(angleInRadians) + center.Y);
child.Arrange(new Rect(childPosition, child.DesiredSize));
angleInRadians += angleIncrRadians;
}
}
return finalSize;
}
}
}