第十九章:集合视图(二十一)

简介:

一个TableView菜单
除了显示数据或用作表单或设置对话框外,TableView也可以是菜单。 功能上,菜单是按钮的集合,虽然它们可能看起来不像传统的按钮。 每个菜单项都是一个触发程序操作的命令。
这就是TextCell和ImageCell具有Command和CommandParameter属性的原因。 这些单元格可以触发ViewModel中定义的命令,或者只是ICommand类型的其他属性。
MenuCommands程序中的XAML文件将四个TextCell元素的Command属性与名为MoveCommand的属性绑定,并传递给名为“left”,“up”,“right”和“down”的MoveCommand参数:

<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             x:Class="MenuCommands.MenuCommandsPage"
             x:Name="page">
 
    <ContentPage.Padding>
        <OnPlatform x:TypeArguments="Thickness"
                    iOS="0, 20, 0, 0" />
    </ContentPage.Padding>
 
    <StackLayout>
        <TableView Intent="Menu"
                   VerticalOptions="Fill"
                   BindingContext="{x:Reference page}">
            <TableRoot>
                <TableSection Title="Move the Box">
                    <TextCell Text="Left"
                              Command="{Binding MoveCommand}"
                              CommandParameter="left" />
 
                    <TextCell Text="Up"
                              Command="{Binding MoveCommand}"
                              CommandParameter="up" />
 
                   <TextCell Text="Right"
                              Command="{Binding MoveCommand}"
                              CommandParameter="right" />
 
                    <TextCell Text="Down"
                              Command="{Binding MoveCommand}"
                              CommandParameter="down" />
                </TableSection>
            </TableRoot>
        </TableView>
 
        <AbsoluteLayout BackgroundColor="Maroon"
                        VerticalOptions="FillAndExpand">
            <BoxView x:Name="boxView"
                     Color="Blue"
                     AbsoluteLayout.LayoutFlags="All"
                     AbsoluteLayout.LayoutBounds="0.5, 0.5, 0.2, 0.2" />
        </AbsoluteLayout>
    </StackLayout>
</ContentPage>

但MoveCommand属性在哪里? 如果查看TableView的BindingContext,您将看到它引用了XAML文件的根元素,这意味着可能会在代码隐藏文件中找到MoveCommand属性作为属性。
它是:

public partial class MenuCommandsPage : ContentPage
{
    int xOffset = 0; // ranges from -2 to 2
    int yOffset = 0; // ranges from -2 to 2
    public MenuCommandsPage()
    {
        // Initialize ICommand property before parsing XAML.
        MoveCommand = new Command<string>(ExecuteMove, CanExecuteMove);
        InitializeComponent();
    }
    public ICommand MoveCommand { private set; get; }
    void ExecuteMove(string direction)
    {
        switch (direction)
        {
            case "left": xOffset--; break;
            case "right": xOffset++; break;
            case "up": yOffset--; break;
            case "down": yOffset++; break;
        }
        ((Command)MoveCommand).ChangeCanExecute();
        AbsoluteLayout.SetLayoutBounds(boxView,
            new Rectangle((xOffset + 2) / 4.0,
                           (yOffset + 2) / 4.0, 0.2, 0.2));
    }
    bool CanExecuteMove(string direction)
    {
        switch (direction)
        {
            case "left": return xOffset > -2;
            case "right": return xOffset < 2;
            case "up": return yOffset > -2;
            case "down": return yOffset < 2;
        }
        return false;
    }
}

Execute方法操纵XAML文件中BoxView的布局边界,使其在AbsoluteLayout周围移动。 如果已将BoxView移动到其中一个边缘,则CanExecute方法将禁用操作。
仅在iOS上,禁用的TextCell实际上显示为典型的灰色,但在iOS和Android平台上,如果CanExecute方法返回false,则TextCell不再起作用:
2018_11_11_125341
您还可以使用TableView作为页面导航菜单或使用主/详细页面,对于这些特定的应用程序,您可能想知道ListView或TableView是否适合作业。 一般来说,如果你有一个项目集合应该以相同的方式显示,那么它就是ListView,或者TableView用于可能需要个别关注的较少项目。
可以肯定的是,你肯定会在前面的章节中看到更多的例子。

目录
相关文章
|
JavaScript Android开发 iOS开发
|
XML JavaScript Android开发