Xamarin.Forms:是否可以在 code-behind 中更新 Shell.TitleView?
Xamarin.Forms: is it possible to update Shell.TitleView in code-behind?
我在开发一个包含 4 个标签的 Xamarin.Forms.Shell 应用程序。
在主选项卡上,我有:
- 一个
TitleView
包含公司的标志
- s
ScrollView
包含 Image
作为 Header
- 一个
ScrollView
包含主要内容,可以覆盖Header完全可见
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"
x:Class="AvilaShellAppSample.Views.HomePage"
Shell.NavBarHasShadow="False"
Shell.NavBarIsVisible="True"
x:Name="homePage">
<!-- TitleView -->
<Shell.TitleView >
<Grid>
<ffimageloadingsvg:SvgCachedImage Source="resource://ShellAppSample.Resources.blackLogoTitle.svg"
DownsampleHeight="6"
HeightRequest="45"/>
</Grid>
</Shell.TitleView>
<ContentPage.BindingContext>
<vm:HomeViewModel />
</ContentPage.BindingContext>
<ContentPage.Content>
<Grid RowSpacing="0"
BackgroundColor="{StaticResource Gray-050}"
Margin="0,0,0,0">
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<Grid Grid.Row="1">
<!-- Header ScrollView : Image -->
<ScrollView>
<ContentView x:Name="headerView"
HorizontalOptions="FillAndExpand"
VerticalOptions="FillAndExpand">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<!-- Header Image -->
<ffimageloading:CachedImage x:Name="headerImage"
Grid.Row="0"
Aspect="AspectFill"
BackgroundColor="{DynamicResource Gray-200}"
DownsampleToViewSize="true"
HeightRequest="280"
HorizontalOptions="FillAndExpand"
VerticalOptions="Start"
Source="resource://ShellAppSample.Resources.indoor.jpg">
</ffimageloading:CachedImage>
</Grid>
</ContentView>
</ScrollView>
<!-- Content ScrollView -->
<ScrollView>
<ctrl:ParallaxScrollView HorizontalOptions="FillAndExpand"
VerticalOptions="FillAndExpand"
ParallaxHeaderView="{x:Reference headerView}"
LogoHeaderView="{x:Reference logoHeaderView}"
HiddenView="{x:Reference hiddenView}"
MainPage="{Binding homePage}">
<Grid ColumnSpacing="0"
RowSpacing="0"
VerticalOptions="FillAndExpand">
<Grid.RowDefinitions>
<RowDefinition Height="220" />
<RowDefinition Height="Auto" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<!-- Content -->
</Grid>
</ctrl:ParallaxScrollView>
</ScrollView>
</Grid>
</Grid>
</ContentPage.Content>
</ContentPage>
我想在 NavigationBar
/StatusBar
上默认显示 header Image
:所以 NavigationBar
将 隐藏 ,而 StatusBar
背景将是 Image
header。
然后我想显示 default NavigationBar
/StatusBar
只有当内容覆盖 Header[= 的一半时56=]:因此 NavigationBar
将 可见 ,而 StatusBar
背景将是默认背景。
但我没有找到任何方法来访问 Shell.NavBarIsVisible
属性 或 code-behind 中的 Shell.TitleView
。
所以我想知道这可能吗?
您需要使用公开的方法来设置属性SetNavBarIsVisible() and SetTitleView()
禁用代码隐藏页面的导航栏:
Shell.SetNavBarIsVisible(this, false);
为代码隐藏中的页面设置自定义 TitleView
:
Label r = new Label();
r.Text = "Hello World";
Shell.SetTitleView(this, (View)r);
我在开发一个包含 4 个标签的 Xamarin.Forms.Shell 应用程序。
在主选项卡上,我有:
- 一个
TitleView
包含公司的标志 - s
ScrollView
包含Image
作为 Header - 一个
ScrollView
包含主要内容,可以覆盖Header完全可见
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"
x:Class="AvilaShellAppSample.Views.HomePage"
Shell.NavBarHasShadow="False"
Shell.NavBarIsVisible="True"
x:Name="homePage">
<!-- TitleView -->
<Shell.TitleView >
<Grid>
<ffimageloadingsvg:SvgCachedImage Source="resource://ShellAppSample.Resources.blackLogoTitle.svg"
DownsampleHeight="6"
HeightRequest="45"/>
</Grid>
</Shell.TitleView>
<ContentPage.BindingContext>
<vm:HomeViewModel />
</ContentPage.BindingContext>
<ContentPage.Content>
<Grid RowSpacing="0"
BackgroundColor="{StaticResource Gray-050}"
Margin="0,0,0,0">
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<Grid Grid.Row="1">
<!-- Header ScrollView : Image -->
<ScrollView>
<ContentView x:Name="headerView"
HorizontalOptions="FillAndExpand"
VerticalOptions="FillAndExpand">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<!-- Header Image -->
<ffimageloading:CachedImage x:Name="headerImage"
Grid.Row="0"
Aspect="AspectFill"
BackgroundColor="{DynamicResource Gray-200}"
DownsampleToViewSize="true"
HeightRequest="280"
HorizontalOptions="FillAndExpand"
VerticalOptions="Start"
Source="resource://ShellAppSample.Resources.indoor.jpg">
</ffimageloading:CachedImage>
</Grid>
</ContentView>
</ScrollView>
<!-- Content ScrollView -->
<ScrollView>
<ctrl:ParallaxScrollView HorizontalOptions="FillAndExpand"
VerticalOptions="FillAndExpand"
ParallaxHeaderView="{x:Reference headerView}"
LogoHeaderView="{x:Reference logoHeaderView}"
HiddenView="{x:Reference hiddenView}"
MainPage="{Binding homePage}">
<Grid ColumnSpacing="0"
RowSpacing="0"
VerticalOptions="FillAndExpand">
<Grid.RowDefinitions>
<RowDefinition Height="220" />
<RowDefinition Height="Auto" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<!-- Content -->
</Grid>
</ctrl:ParallaxScrollView>
</ScrollView>
</Grid>
</Grid>
</ContentPage.Content>
</ContentPage>
我想在 NavigationBar
/StatusBar
上默认显示 header Image
:所以 NavigationBar
将 隐藏 ,而 StatusBar
背景将是 Image
header。
然后我想显示 default NavigationBar
/StatusBar
只有当内容覆盖 Header[= 的一半时56=]:因此 NavigationBar
将 可见 ,而 StatusBar
背景将是默认背景。
但我没有找到任何方法来访问 Shell.NavBarIsVisible
属性 或 code-behind 中的 Shell.TitleView
。
所以我想知道这可能吗?
您需要使用公开的方法来设置属性SetNavBarIsVisible() and SetTitleView()
禁用代码隐藏页面的导航栏:
Shell.SetNavBarIsVisible(this, false);
为代码隐藏中的页面设置自定义 TitleView
:
Label r = new Label();
r.Text = "Hello World";
Shell.SetTitleView(this, (View)r);