Xamarin.forms: [增强] 增加 FlyoutItem.IsVisible、Tab.IsVisible、BaseShellItem.IsVisible

创建于 2019-02-13  ·  26评论  ·  资料来源: xamarin/Xamarin.Forms

概括

提供附加属性,以便用户可以更直接地定义某些内容是在 Flyout 中还是在 TabBar 中可见。

未来的 API 建议

我们应该添加选项,以便当用户使用FlyoutDisplayOptions="AsMultipleItems"时,他们可以选择将父级显示为标题。 使用扩展控件,我们也可以将其添加为设置。

API

```C#
FlyoutItem.IsVisible //BP附加属性
Tab.IsVisible //BP附加属性
BaseShellItem.IsVisible // BP(未附加属性)

## Examples BaseShellItem.IsVisible 

If you set BaseShellIitem IsVisible to false it won't show up in the Flyout or on any of the tabs

## Examples Tab.IsVisible

```xaml
<TabBar>
    <Tab Title="Tab 1">
          <ShellContent Title="Top Tab 1" />
          <ShellContent Title="Top Tab 2"  Tab.IsVisible="false"/>
          <ShellContent Title="Top Tab 3" />
    </Tab>
    <Tab Title="Tab 2" Tab.IsVisible="false">
    </Tab>
</TabBar>

示例 FlyoutItem.IsVisible

用户想要一个不反映屏幕上任何选项卡的 Flyout。

<MenuItem title="item 1 "/>
<MenuItem title="item 2" />
<MenuItem title="item 3" />
<TabBar Shell.FlyoutBehavior="Flyout" FlyoutItem.IsVisible="False">
    <Tab>
    </Tab>
</TabBar>

渲染 3 个弹出项

  • 项目 1
  • 第 2 项

- 项目 3

<FlyoutItem title="item 1 " />
<FlyoutItem title="item 2" />
<ShellContent title="Content" FlyoutItem.IsVisible="False" />

即使您在 ShellContent 元素上,也会呈现 2 个弹出项

  • 项目 1
  • 第 2 项

预期用例

我想到的用例是在汉堡菜单中有一个项目,供用户将应用程序升级到高级版。 一旦用户升级了该项目,则该项目将不再可见。
家长:#2415

shell in-progress high impact proposal-accepted enhancement ➕

最有用的评论

我们能得到这方面的最新消息吗? (真的,真的很想要这个!)

所有26条评论

这事有进一步更新吗?

@PureWeen我在 Xam 开发峰会上看到你在使用这个,这是在 Pre 还是什么?

另一个预期的用例是一组功能(经常使用)应该在底部标签栏上可见,而另一组功能(设置、恢复购买、帮助、关于等)应该可以从汉堡菜单访问。 如果这已经可行,请告诉我。

我们能得到这方面的最新消息吗? (真的,真的很想要这个!)

真的需要这个

这事有进一步更新吗?

任何更新? 我们真的需要这个。

这事有进一步更新吗?

除非您正在构建一个非常小的应用程序,否则 Shell 似乎几乎没有用。 没有这个,我们无法设置权限或隐藏我们不想要的弹出页面。 这怎么不是现在的优先事项?

你是对的@brepetti
我想知道我是否在这里遗漏了什么......

@rodrigojuarez @brepetti

有趣的部分是在去年的 XDS 上,它被讨论为一个很快就会出现的项目……到了他们展示它的地步。

我认为这可能最终成为一个阻止程序,因为它处理导航堆栈的方式。 因为我知道 XDS 上显示的示例主要使用自定义/重建的导航堆栈。

通过手动创建 ShellContent 项(添加、删除),我设法通过手动解决方法使其适用于 TabBar 顶部选项卡。 在 Xamarin.Forms 4.6 中,它现在也适用于 iOS(仅在 1 天前在 4.6 中修复)。

汉堡菜单也应该适用吗?

@malte1989是的,我们正在谈论一个外壳项目,也就是外壳视觉树上的东西。

@malte1989你能提供一些示例代码吗?

@malte1989你能提供一些示例代码吗?

当然,我明天会发布我的标签栏解决方案的代码。

@Jakar510

AppShell.xaml

<TabBar Route="tabBar">
        <Tab 
            x:Name="myTab" 
            Route="tab1"
            Icon="tab_icon1.png">
            <ShellContent 
                x:Name="shellStart"
                Route="route1A" 
                Title="title" 
                ContentTemplate="{DataTemplate view:Page1A}" />
        </Tab>
        <Tab 
            Route="tab2"
            Icon="tab_icon2.png">
            <ShellContent 
                Route="route2" 
                Title="title2" 
                ContentTemplate="{DataTemplate view:Page2}" />
        </Tab>
        </Tab>
        <Tab 
            Route="tab3"
            Icon="tab_icon3.png">
            <ShellContent 
                Route="route3" 
                Title="title3" 
                ContentTemplate="{DataTemplate view:Page3}" />
        </Tab>
    </TabBar>

AppShell.xaml.cs

public ShellContent shell0;
public ShellContent shell1;
public ShellContent shell2;
public ShellContent shell3;
public static Tab tabLocal;

构造函数

            tabLocal = myTab;
            shell0 = shellStart;
            shell1 = new ShellContent()
            {
                Content = new Page1B(),
                Title = "",
                Route = ""
            };
            shell2 = .... Page1C() ...
            shell3 = .... Page1D() ...
            ...

将页面 0 切换到 1

AppShell.tabLocal.Items.Add(shell1);
AppShell.tabLocal.Items.Remove(shell0);

也许你需要这两种方法来处理你的导航

protected async override void OnNavigating(ShellNavigatingEventArgs args)
protected override void OnNavigated(ShellNavigatedEventArgs args)

我希望这可以帮助你。 如果这对您有用,请告诉我。

我将为此工作 4.7/4.8

如果有人想发表评论,我更新了规范

@PureWeen不,但我确实希望当您开始处理此问题时,您可以发布 twitch 流,以便我们确保收听 👍

我将为此工作 4.7/4.8
如果有人想发表评论,我更新了规范

抱歉这个愚蠢的问题:我在哪里可以找到并阅读规格?

@ncarandini我刚刚用规范更新了关于这个问题的描述

是啊谢谢!

我相信我找到了解决方法(目前)。
做这个:

  • 给你的 flyoutitem 或项目命名,例如
    <FlyoutItem Title="Self Review" x:Name="fiSelf"> <FlyoutItem.Icon> <FontImageSource FontFamily="{StaticResource sapcIconFont}" Glyph="{StaticResource IconUser}" Color="{StaticResource IconColor}"/> </FlyoutItem.Icon> <ShellContent> <viewsAssess:StartSelfPage /> </ShellContent> </FlyoutItem>

  • 覆盖 AppShell.cs 中的 OnBindingContextChanged ,并添加代码以检查条件以隐藏和显示,然后在 flyitem 的 Items 属性上调用 Clear 方法
    protected override void OnBindingContextChanged() { base.OnBindingContextChanged(); if(App.IsIntern) { fiAssess.Items.Clear(); fiPeer.Items.Clear(); fiSelf.Items.Clear(); fiVerifications.Items.Clear(); } }

为我工作

由 #10980 关闭

这仍然表现得很奇怪,每当我们动态更改 BaseShellItem 上的 IsVisible 属性时,ShellContent 的样式就会一次又一次地丢失。 在外壳内容之上推送一个页面然后弹出它似乎可以修复它。

一个例子是有 2 个页面,外壳内容 X 有一个按钮,该按钮更改绑定到外壳内容 Y 上的 IsVisible 属性的布尔属性

@GeorgeVelikov你能记录一个问题吗?

此页面是否有帮助?
0 / 5 - 0 等级