Xamarin.Forms UWP TabbedPage中的选项卡图标?

时间:2017-11-21 19:42:15

标签: xamarin.forms uwp xamarin.uwp tabbedpage

在Xamarin.Forms中组合 TabbedPage 时,如何让UWP使用该网页的图标属性?

如果我正确配置表单属性/文件,那么looks like UWP could support this就好了。

这是我的TabbedPage XAML。这些图标都已设置好并适用于iOS和Android,甚至UWP中的页面上的图像渲染也很好(这意味着文件可能在项目中正确)。

<TabbedPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:local="clr-namespace:tabbed"
             x:Class="tabbed.MainPage">
    <TabbedPage.Children>
        <local:InitialPage Title="Tab1" Icon="star.png" />
        <ContentPage Title="Tab2" Icon="gear.png">
            <ContentPage.Content>
                <StackLayout>
                    <Label Text="A nice label." />
                    <Image Source="star.png" /><!-- works here -->
                </StackLayout>
            </ContentPage.Content>
        </ContentPage>
    </TabbedPage.Children>
</TabbedPage>

2 个答案:

答案 0 :(得分:3)

我在此http://depblog.weblogs.us/2017/07/12/xamarin-forms-tabbed-page-uwp-with-images/

概述了这是如何实现的

简而言之,您需要更改UWP正在使用的默认HeaderTemplate。但由于Xamarin形式的启动方式,这并不简单。 因此,您需要将自定义模板注入资源字典中。

示例项目在Github上进行https://github.com/Depechie/XamarinFormsTabbedPageUWPWithIcons

更长的细节:

您需要提供自己的TabbedPageStyle并切换Xamarin用于其UWP渲染的那个。 所以新样式包含一个Image,我们将数据绑定到Xamarin Icon属性。

<Style x:Key="TabbedPageStyle2" TargetType="uwp:FormsPivot">
    <Setter Property="HeaderTemplate">
        <Setter.Value>
            <DataTemplate>
                <StackPanel Orientation="Vertical">
                    <Image Source="{Binding Icon, Converter={StaticResource IconConverter}}" Width="15" Height="15" />
                    <TextBlock Name="TabbedPageHeaderTextBlock" Text="{Binding Title}"
                                Style="{ThemeResource BodyTextBlockStyle}" />
                </StackPanel>
            </DataTemplate>
        </Setter.Value>
    </Setter>
</Style>

实际的样式切换是在App.Xaml.cs这样的

中完成的
((Style)this.Resources["TabbedPageStyle"]).Setters[0] = ((Style)this.Resources["TabbedPageStyle2"]).Setters[0];

你还需要一个转换器来确保Image控件理解Xamarin提供的Icon源

public class IconConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, string language)
    {
        if (value != null && value is Xamarin.Forms.FileImageSource)
            return ((Xamarin.Forms.FileImageSource)value).File;

        return null;
    }

    public object ConvertBack(object value, Type targetType, object parameter, string language)
    {
        throw new NotImplementedException();
    }
}

答案 1 :(得分:2)

目前,UWP TabbedPage renderer根本不使用Icon属性,因此获取标签图标将需要自定义渲染器。甚至官方的UWP样本实际上似乎也没有这个烘焙,requiring a custom UserControl

Android TabbedPageRendereriOS TabbedRenderer,甚至是macOS TabbedPageRenderer,都使用Icon属性来调整标签页UI,但是UWP渲染器需要更新才能使其正常工作。