Windows 通用应用程序中的卡片视图 material 设计

Card View material design in Windows Universal Apps

我想开发一个类似微软Universal MSN News App设计的博客应用程序。我想要类似下图所示的设计。

我查看了这个新闻应用程序,发现许多很酷的功能都与 Pivot 设计相结合。

我有几个问题:

谢谢。感谢任何帮助。

Custom-sized 网格

  • 创建您自己的小部件(扩展基本小部件 class)以表示单个网格。网格的大小将由其中的文本量或您希望的任何其他因素决定。
  • 使用 table 或网格布局。对于 Gtk+,请参见此处:https://developer.gnome.org/gtk3/stable/GtkGrid.html
  • 将您的自定义小部件附加到布局。

延迟加载

  • 我知道的所有工具包的滚动小部件都会在用户到达底部(或顶部或左侧边缘或右侧边缘)时发出信号。
  • 抓住这个信号并向布局添加更多自定义网格小部件。您可能需要重新显示布局的内容,这有点低效;或许使用多线程。
  • 在 Gtk+ 3 中,edge-reached 在到达任何边缘时由 ScrolledWindow 发出。

这是一般概念。快速 Google 搜索将显示您选择的 GUI 工具包如何执行上述操作。

您可以使用一些 third-party 库:The-UWP-Tools-List

通过以下命令很容易集成Marduk.Controls

PM> Install-Package Marduk.Controls

您可以看到我的代码示例:

<Page
x:Class="App1.MainPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:App1"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:controls="using:Marduk.Controls"
mc:Ignorable="d">

<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
    <ScrollViewer>
        <controls:WaterfallFlowView x:Name="Panel" ItemSource="{Binding cc}" StackCount="3" DelayMeasure="True">
            <controls:WaterfallFlowView.Resizer>
                <local:MyItemResizer/>
            </controls:WaterfallFlowView.Resizer>
            <controls:WaterfallFlowView.ItemContainerStyle>
                <Style TargetType="ContentControl">
                    <Setter Property="HorizontalAlignment" Value="Stretch"></Setter>
                    <Setter Property="HorizontalContentAlignment" Value="Stretch"></Setter>
                </Style>
            </controls:WaterfallFlowView.ItemContainerStyle>
            <controls:WaterfallFlowView.ItemTemplate>
                <DataTemplate>
                    <Border Height="{Binding Length}" Background="{Binding Brush}" HorizontalAlignment="Stretch">
                        <TextBlock FontSize="50" Text="{Binding Num}" HorizontalAlignment="Center" VerticalAlignment="Center"/>
                    </Border>
                </DataTemplate>
            </controls:WaterfallFlowView.ItemTemplate>
        </controls:WaterfallFlowView>
    </ScrollViewer>
</Grid>

public sealed partial class MainPage : Page
{
    public ObservableCollection<Test> cc { get; set; }
    public MainPage()
    {
        this.InitializeComponent();
        cc = new ObservableCollection<Test>();
        cc.Add(new Test() {Length=200,Brush= new SolidColorBrush(Colors.Red),Num=1 });
        cc.Add(new Test() { Length = 150, Brush = new SolidColorBrush(Colors.Blue), Num = 2 });
        cc.Add(new Test() { Length = 100, Brush = new SolidColorBrush(Colors.LightCyan), Num = 3 });
        cc.Add(new Test() { Length = 50, Brush = new SolidColorBrush(Colors.SandyBrown), Num = 4 });
        this.DataContext = this;
    }
}

public class Test
{
    public double Length { get; set; }

    public SolidColorBrush Brush { get; set; }

    public int Num { get; set; }
}

public class MyItemResizer : IItemResizer
{
    public Size Resize(object item, Size oldSize, Size availableSize)
    {
        return new Size(availableSize.Width, oldSize.Height);
    }
}

UWPCommunityToolkit