在 UWP Xaml 中创建并填充 NxN 网格

2023-11-22

我正在尝试创建一个UWP益智游戏,我想将图片切成n个部分,然后在网格中显示这些部分。

我的问题是,如何强制某种 NxN 风格。现在我必须最大化窗口才能看到 3x3 网格,如果我缩小任一侧,它将收敛到 2 列、1 列网格。有办法处理这个问题吗?

这就是我所做的,我知道 RowDefinition 现在是手动的,直到我找到更好的方法来做到这一点。

<UserControl
    x:Class="PictureSplitter.Views.PictureView"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d"
    d:DesignHeight="300"
    d:DesignWidth="400">


        <GridView ItemsSource="{Binding Splitter.PuzzlePositions}">

            <GridView.ItemTemplate>
                <DataTemplate>
                    <Border BorderBrush="Red" BorderThickness="2">
                    <Grid x:Name="picGrid">
                        <Grid.RowDefinitions>
                            <RowDefinition Height="Auto"></RowDefinition>
                            <RowDefinition Height="Auto"></RowDefinition>
                            <RowDefinition Height="Auto"></RowDefinition>
                        </Grid.RowDefinitions>
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition Width="Auto"></ColumnDefinition>
                            <ColumnDefinition Width="Auto"></ColumnDefinition>
                            <ColumnDefinition Width="Auto"></ColumnDefinition>
                        </Grid.ColumnDefinitions>
                        <Image Source="{Binding Piece.ImageSource}" />
                    </Grid>
                </Border>
                </DataTemplate>
            </GridView.ItemTemplate>

        </GridView>

</UserControl>

This are two example images: Wanted gridstyle

Not wanted gridstyle


可能有几种方法可以做到这一点,这是另一种。我已经修改了用户控制这样,当页面大小更改和/或集合更改时,它会自动调整项目大小以将其显示为方形网格。

用户控件 XAML 代码:

<UserControl
    x:Class="MyControls.MyUserControl"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="using:MyControls"
    Name="myControl">

    <GridView Background="{ThemeResource ApplicationPageBackgroundThemeBrush}" ItemsSource="{Binding ElementName=myControl, Path=Items}"
              Width="{Binding ElementName=myControl, Path=CurrentWidth}" HorizontalAlignment="Center"
              Height="{Binding Width, RelativeSource={RelativeSource Self}}">
        <GridView.ItemContainerStyle>
            <Style TargetType="GridViewItem">
                <Setter Property="Margin" Value="0"/>
            </Style>
        </GridView.ItemContainerStyle>
        <GridView.ItemTemplate>
            <DataTemplate>
                <Border Padding="10" Width="{Binding ElementName=myControl, Path=ElementSize}" Height="{Binding ElementName=Width, RelativeSource={RelativeSource Self}}">
                    <Border BorderBrush="Red" BorderThickness="3">
                        <Image Source="ms-appx:///Assets/StoreLogo.png" Stretch="UniformToFill"/>
                    </Border>
                </Border>
            </DataTemplate>
        </GridView.ItemTemplate>
    </GridView>
</UserControl>

用户控制背后的代码:

public sealed partial class MyUserControl : UserControl, INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;
    private void RaiseProperty(string name) => PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));

    public IList Items
    {
        get { return (IList)GetValue(ItemsProperty); }
        set { SetValue(ItemsProperty, value); }
    }

    public static readonly DependencyProperty ItemsProperty =
        DependencyProperty.Register("Items", typeof(IList), typeof(MyUserControl),
            new PropertyMetadata(0, (s, e) =>
            {
                if (Math.Sqrt((e.NewValue as IList).Count) % 1 != 0)
                    Debug.WriteLine("Bad Collection");
            }));

    public void Items_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
    {
        if (Math.Sqrt(Items.Count) % 1 != 0) Debug.WriteLine("Bad Collection");
        RaiseProperty(nameof(ElementSize));
    }

    private double currentWidth;
    public double CurrentWidth
    {
        get { return currentWidth; }
        set { currentWidth = value; RaiseProperty(nameof(CurrentWidth)); RaiseProperty(nameof(ElementSize)); }
    }

    public double ElementSize => (int)(currentWidth / (int)Math.Sqrt(Items.Count)) - 1;

    public MyUserControl()
    {
        this.InitializeComponent();
    }
}

主页 XAML:

<Grid>
    <local:MyUserControl x:Name="myControl" Items="{Binding MyItems}"/>
    <Button Content="Add" Click="Button_Click"/>
</Grid>

主页后面的代码:

public sealed partial class MainPage : Page
{
    private ObservableCollection<int> myItems = new ObservableCollection<int> { 1, 2, 3, 4, 5, 6, 7, 8 };
    public ObservableCollection<int> MyItems
    {
        get { return myItems; }
        set { myItems = value; }
    }

    public MainPage()
    {
        this.InitializeComponent();
        DataContext = this;
        MyItems.CollectionChanged += myControl.Items_CollectionChanged;
    }

    protected override Size MeasureOverride(Size availableSize)
    {
        myControl.CurrentWidth = Math.Min(availableSize.Height, availableSize.Width);
        return base.MeasureOverride(availableSize);
    }

    private void Button_Click(object sender, RoutedEventArgs e) => MyItems.Add(3);
}

该程序以“Bad Collection”开始 - 有 8 个项目,因此您无法用它们制作方形网格,但是一旦单击提供的按钮 - 集合的计数就会更改为 9 并且网格应该自行更新。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 UWP Xaml 中创建并填充 NxN 网格 的相关文章

随机推荐

  • grep 查找包含“\t”的行

    我被要求制作一个 shell 脚本来检查文件中的简单错误 我想找到 对于每一行 如果 正则表达式 t 曾经发生过 问题是 grep 忽略了 并将 t 作为文字 我还尝试将字符本身写入文件并要求 grep 读取它 但它不起作用 有没有办法使用
  • iPhone 操作系统:如何以编程方式区分 iPad 3G 和 iPad Wi-Fi?

    iPhone OS 中是否有任何属性或其他机制可以在运行时检查应用程序是否在 iPad 3G 或 iPad Wi Fi 上运行 似乎 UIDevice 类没有提供类似的东西 我的应用程序广泛使用互联网访问 我想明确警告用户 在 3G 上可能
  • Fragment onCreateView 和 onActivityCreated 调用两次

    我正在使用 Android 4 0 ICS 和片段开发一个应用程序 请考虑 ICS 4 0 3 API 级别 15 API 演示示例应用程序中的修改示例 public class FragmentTabs extends Activity
  • 带有 SVG 颜色渐变的圆形进度指示器?

    我需要制作一个带有颜色渐变的圆形进度指示器 我还需要将进度圈的 末端 弄圆 这张图片包含了我想要实现的一切 此代码很接近 但没有颜色渐变 https codepen io adsfdsfhdsafkhdsafjkdhafskjds pen
  • 将变量从容器开始传递到文件

    我在 Dockerfile 中有以下几行 我想在应用程序最后启动之前将配置文件中的值设置为默认值 并提供可选的使用 e启动容器时的选项 我正在尝试使用 Docker 来做到这一点ENV突击队 ENV CONFIG VALUE default
  • 我使用的是哪个版本的 Kohana?

    Kohana框架中哪里可以找到版本信息 我在教程中看到的所有内容都与我在应用程序中看到的内容相反 我认为这是一个版本问题 因为文档和我的安装之间的方法和调用略有不同 至少对于 gt 3 0 的版本 Kohana 的版本号位于system c
  • Applescript 右键单击​​文件

    苹果脚本中是否有一个命令可以右键单击文件并调出上下文菜单 我正在寻找类似的东西 tell application Finder set theDesktopItems to every item of desktop right click
  • 如何逃脱液体模板标签?

    这听起来很简单 但是我在文档中找不到它 我怎样才能写 this in a liquid模板 未经引擎处理 可以使用以下命令禁用液体处理引擎raw tag raw this endraw 将显示 this
  • 将 Node.js 应用程序(托管在 GAE 上)的 IP 列入白名单以访问 MongoDB Atlas(托管在 GCP 上)

    我希望我的后端服务器 Node js 托管在 Google App Engine 上 灵活的环境 如果重要的话 能够从我的数据库 MongoDB 通过 Atlas 也托管在同一区域的 Google Cloud 平台上 获取和传递数据作为我的
  • 如何配置 flot 以在 y 轴零点处绘制缺失的时间序列?

    我正在使用浮点 github上的浮动 用以下时间序列数据绘制图表 1357171200000 1 1357344000000 1 1357430400000 2 1357516800000 2 1357689600000 3 1357776
  • 如何在Magento中连接多个外部数据库? [关闭]

    Closed 这个问题是无关 目前不接受答案 我需要从 Magento 连接到一些外部数据库 我找到了一个教程在 Magento 中创建外部数据库连接 本教程很有帮助 它适用于连接到一个外部数据库 但是 我必须连接多个外部数据库 如何在 M
  • django.core.paginator 使用 jQuery 进行 Ajax 分页

    Problem 我需要在 Django 模板中使用 jQuery 进行 Ajax 分页 情况 我的模板中有以下代码 code omitted table table
  • PHP spl_自动加载

    我真的没有得到 spl autoload 的文档 bool spl autoload register callback autoload function 根据我的理解 当 php 遇到尚未加载的类时 它将尝试运行注册的函数 例如 pub
  • 我可以使用 open_basedir 访问 /dev/urandom 吗?

    我想在 Codeigniter 中使用 phpass 0 3 但由于以下原因出现以下错误open basedir 遇到 PHP 错误严重性 警告消息 is 可读 函数 可读 open basedir 限制生效 文件 dev urandom
  • 为什么 Google API V3 不返回子级?

    我想使用 Python 获取 Google Drive 中给定文件夹中的所有文件 文件夹的列表 我正在使用的调用是这样的 query parentID in parents response service files list q que
  • 自定义创建的方法错误:“不是函数”

    我有一个英雄按钮列表 其中创建了自定义动画button component ts 一开始 他们是不活跃的 当我按下其中之一时 所选的应该变为活动状态 为此 我创建了一个字段hero ts called state和一个名为的函数toggle
  • 使用 css 按对角线分割双色调背景

    我正在尝试使用 css 创建一个背景 其中一侧是纯色 另一侧是纹理 两者被对角线分开 我希望这是 2 个独立的 div 因为我计划使用 jQuery 添加一些动作 如果您单击右侧 灰色三角形会变小 如果您单击左侧 纹理三角形会变小 就像窗帘
  • Safari 为 Silverlight (NPAPI) 计划的生命周期是怎样的

    Chrome 已经放弃了 NPAPI silverlight 支持 Firefox 宣布将于 2016 年底停止对 NPAPI 支持 https blog mozilla org futurereleases 2015 10 08 npap
  • 如何从 MSI“文件”表中提取数据(文件计数)

    在我们的构建过程中 当前有可能将基于非代码的文件 例如图像文件 添加到我们的 Web 项目中 但不包含在 WiX 构建的 MSI 安装程序中 为了帮助防止这种情况 我想在 WiX 项目的 AfterBuild 目标中执行以下操作 获取所有已
  • 在 UWP Xaml 中创建并填充 NxN 网格

    我正在尝试创建一个UWP益智游戏 我想将图片切成n个部分 然后在网格中显示这些部分 我的问题是 如何强制某种 NxN 风格 现在我必须最大化窗口才能看到 3x3 网格 如果我缩小任一侧 它将收敛到 2 列 1 列网格 有办法处理这个问题吗