Xamarin.Forms AppShell 中的共享 TitleView

Posted

技术标签:

【中文标题】Xamarin.Forms AppShell 中的共享 TitleView【英文标题】:Shared TitleView in Xamarin.Forms AppShell 【发布时间】:2019-10-16 08:49:31 【问题描述】:

有没有办法在 Xamarin.Forms AppShell 中实现共享的 TitleView 组件?我尝试了几种方法,但都没有达到我的预期。

我想要达到的目标如下:

带有几个选项卡和一个通用 Shell TitleView 的 App Shell titleView 只是一个 ContentView(我们称之为 Exposure),带有一个用于显示计算结果的标签和一个用于获取数据并重新计算的刷新按钮 更改 Tab 不应影响 TitleView 的状态

我尝试过的:

初始化 Exposure 组件的一个实例(View 和 ViewModel)并在 DI 框架上将其配置为仅使用该实例(单例)。 页面初始化后,我获得了 Exposure 组件的单个实例并将其分配给 Shell.TitleView 属性。

通过这样做,我希望各个选项卡的 Exposure 状态保持一致(毕竟是单个实例......),但是当我点击刷新按钮时,它只会刷新当前选项卡 Exposure 上的计算组件,更改选项卡将为我提供具有旧状态的 Exposure 组件。我很惊讶这不支持开箱即用(在 Shell 级别配置 titleView),但我可能会遗漏一些东西。

可能不相关,但我使用的是 ReactiveUI (MVVM) 和 Splat(依赖注入)

我愿意尝试的下一件事是在每个页面重新出现但感觉不可靠时触发刷新。

【问题讨论】:

一般来说,我认为您希望避免将视图/视图模型设为单例。但是,如果您要注册一个将维护计算状态的单例服务,将其注入您的虚拟机,然后将数据绑定到视图,状态将在单例服务上维护,并在视图和视图模型之间共享,这应该被注册为瞬态。 @MaxHampton 说得对,似乎是一个更好的模式。实际上,我有一个用于维护原始数据状态的服务的单例,然后视图模型对其进行了轻微的转换,但我可能会因为不必使用单例组件(视图+视图模型)而对事物进行不同的塑造。 如果您使用的是 ReactiveUI,请查看 DynamicData (github.com/reactiveui/DynamicData) 的数据服务,它们可以很好地结合在一起。 @PaulCharlton 谢谢。实际上,我已经在使用它,但仅在 ViewModel 上(使用 SourceCache),但也许我需要在获取数据的实际服务的上一层使用它。我对 ReactiveUI 很陌生,所以我一直在涉足和重构东西。 【参考方案1】:

您可以创建一个基础的 ContentPage 并设置它的 TitleView 的样式。

<?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:d="http://xamarin.com/schemas/2014/forms/design"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
             mc:Ignorable="d"
             x:Class="xxx.BaseContentPage">
    <NavigationPage.TitleView>
        <StackLayout>
            //...
        </StackLayout>
    </NavigationPage.TitleView>
    <ContentPage.Content>
        <StackLayout>
            //...
        </StackLayout>
    </ContentPage.Content>
</ContentPage>

【讨论】:

感谢您的回答,但风格不是问题。当我切换标签时,这种状态没有被维护。我想我对你建议的方法有完全相同的问题。我愿意尝试一下,如果它适用于 Shell(不确定 shell 是否适用于 NavigationPage) 当然你也可以使用 ResourceDictionary ,但它只允许你设置基本属性(例如按钮颜色和导航栏背景颜色)。 这仍然是风格(我对此没有意见) 你测试我的解决方案了吗? Zhang 是的,如果没有我做一些调整,它对我不起作用。我必须将一个单例 ViewModel 注入到 BaseContentPage 中,以便基于它的所有组件共享相同的状态。照原样,您的回答不够完整,我无法接受。

以上是关于Xamarin.Forms AppShell 中的共享 TitleView的主要内容,如果未能解决你的问题,请参考以下文章

Xamarin Forms App Shell OnPropertyChanged 未更新 FlyoutHeader 视图

导航栏下方的 AppShell Flyout 下方

Xamarin.Forms.Forms.Init(e) Onlaunched 中的 FileNotFoundExeception

xamarin.forms 中的页面生命周期事件

ScrollView 问题中的 Xamarin.Forms 捏手势

Xamarin.Forms 中的 EmguCV 实现