Mobile 如何使用正方形创建响应网格?

Mobile 如何使用正方形创建响应网格?,mobile,grid,xamarin,xamarin.forms,Mobile,Grid,Xamarin,Xamarin.forms,我现在正在创建一个网格,里面充满了按钮。现在我希望这个网格是响应性的,按钮是方形的。我想要创建的东西看起来像iOS或Android主屏幕(只是按钮) Grid Grid=新网格 { HorizontalOptions=LayoutOptions.StartAndExpand, 行间距=15, 柱间距=15, 列定义= { new ColumnDefinition{Width=new GridLength(1,GridUnitType.Star)}, new ColumnDefinition{Wi

我现在正在创建一个网格,里面充满了按钮。现在我希望这个网格是响应性的,按钮是方形的。我想要创建的东西看起来像iOS或Android主屏幕(只是按钮)

Grid Grid=新网格
{
HorizontalOptions=LayoutOptions.StartAndExpand,
行间距=15,
柱间距=15,
列定义=
{
new ColumnDefinition{Width=new GridLength(1,GridUnitType.Star)},
new ColumnDefinition{Width=new GridLength(1,GridUnitType.Star)},
new ColumnDefinition{Width=new GridLength(1,GridUnitType.Star)}
}
};
对于(int i=0;i<12;i++)
{
MonitorButton=新建MonitorButton();
grid.Children.Add(按钮,i%3,i/3);
}
this.Content=新的滚动视图
{
衬垫=新厚度(15),
方向=滚动方向。垂直,
内容=网格
};
在这里,我创建了一个包含3列的网格,其中填充了12个监视器按钮(背景上有图像的按钮)。看起来不错。。现在,当我以横向模式打开屏幕时,屏幕上充满了矩形,因为列的数量仍然相同。。。
我怎样才能解决这个问题?我希望有某种动态可能性(例如:itemscontrol@XAML)。

当您旋转屏幕时,当前页面会自动调整大小,因此它会在页面中调用OnSizeRequest方法。如果重写该方法,则可以同时检测大小和方向

YourPage.cs | | YourPage.xaml.cs

protected override SizeRequest OnSizeRequest(double widthConstraint, double heightConstraint)
{
    if(widthConstraint>heightConstraint)
    {
        //landscape mode
        //set your grid row & columndefinitions
    }
    else
    {
        //portait mode
        //set your grid row & columndefinitions
    }
    return base.OnSizeRequest(widthConstraint, heightConstraint);
}
我认为这个定制的(自定义网格控件)网格会更好地使用,它有命令,所以你可以识别哪个项目被点击,因此我认为你可能不需要在你的UI上也有这么多的按钮。 您可以在网格单元中添加任何想要的控件(在正方形中,就像添加了按钮一样)

Xaml

<?xml version="1.0" encoding="utf-8" ?>
<Grid xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             x:Class="Test.Controls.GridView">

</Grid>
然后在任何你想要的地方使用这个控件。i、 e.在任何内容页上。这将是您的实际视图(仪表板)

子载波.Xaml

<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:control="clr-namespace:Test.Controls"
            x:Class="Test.Views.SubCarriers" Title="Details Dashboard">
    <ContentPage.Content>
        <ScrollView Margin="5">
            <control:GridView HorizontalOptions="FillAndExpand"
                        Grid.Row="1"
                        VerticalOptions="FillAndExpand"
                        RowSpacing="5"
                        ColumnSpacing="5"
                        MaxColumns="2"
                        ItemsSource="{Binding SubCarriersCnt}"
                        CommandParameter="{Binding SubCarriersCnt}"
                        Command="{Binding ClickCommand}"
                        IsClippedToBounds="False">
                <control:GridView.TileHeight>
                    <OnPlatform x:TypeArguments="x:Single"
                      iOS="60"
                      Android="90"
                      WinPhone="90" />
                </control:GridView.TileHeight>
            </control:GridView>
        </ScrollView>
    </ContentPage.Content>
</ContentPage>

Xamarin.Forms中当前没有GridView。您必须计算列宽(和间距)并动态添加列定义。这将使用
%
来完成。嗨,我已经实现了所有功能,除了ClickCommand之外,其他功能都可以正常工作。我尝试了几种方法,但无法获得单击操作。如果可以,请共享代码。
<?xml version="1.0" encoding="utf-8" ?>
<Grid xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             x:Class="Test.Views.SubControlsView" BackgroundColor="CornflowerBlue">
    <StackLayout VerticalOptions="CenterAndExpand">
        <!--You can add any controls which you want--> 
        <!--<Label Text="{Binding id}" HorizontalOptions="CenterAndExpand" TextColor="White" />-->

    </StackLayout>
</Grid>
using Xamarin.Forms;
using Xamarin.Forms.Xaml;

namespace Test.Views
{
    [XamlCompilation(XamlCompilationOptions.Compile)]
    public partial class SubControlsView : Grid
    {
        public SubControlsView()
        {
            InitializeComponent();
        }

        public SubControlsView(object item)
        {
            InitializeComponent();
            BindingContext = item;
        }
    }
}
<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:control="clr-namespace:Test.Controls"
            x:Class="Test.Views.SubCarriers" Title="Details Dashboard">
    <ContentPage.Content>
        <ScrollView Margin="5">
            <control:GridView HorizontalOptions="FillAndExpand"
                        Grid.Row="1"
                        VerticalOptions="FillAndExpand"
                        RowSpacing="5"
                        ColumnSpacing="5"
                        MaxColumns="2"
                        ItemsSource="{Binding SubCarriersCnt}"
                        CommandParameter="{Binding SubCarriersCnt}"
                        Command="{Binding ClickCommand}"
                        IsClippedToBounds="False">
                <control:GridView.TileHeight>
                    <OnPlatform x:TypeArguments="x:Single"
                      iOS="60"
                      Android="90"
                      WinPhone="90" />
                </control:GridView.TileHeight>
            </control:GridView>
        </ScrollView>
    </ContentPage.Content>
</ContentPage>
using System;
using Test.ViewModels;
using Xamarin.Forms;
using Xamarin.Forms.Xaml;
using CommonUtility;

namespace Test.Views
{
    [XamlCompilation(XamlCompilationOptions.Compile)]
    public partial class SubCarriers : ContentPage
    {
        private YourViewModel viewModel;

        public SubCarriers()
        {
            InitializeComponent();
            this.BindingContext = new SubCarriersViewModel();
            viewModel = (YourViewModel)this.BindingContext;
        }

    }
}