首页 > 解决方案 > Expander 是否不适用于 Xamarin Forms MacOS?

问题描述

我正在尝试实现ExpanderXamarin 团队在 MacOS 上发布的新增功能。

我正在关注本指南:Xamarin Forms: How to set a list of items as the Expander Child?

<StackLayout x:Name="expanderLayout" IsVisible="False" BindableLayout.ItemsSource="{Binding  AllItems,Mode=TwoWay}">
    <BindableLayout.ItemTemplate>
        <DataTemplate>
            <Expander
                    ExpandAnimationEasing="{x:Static Easing.CubicIn}"
                    ExpandAnimationLength="500"
                    CollapseAnimationEasing="{x:Static Easing.CubicOut}"
                    CollapseAnimationLength="500">
                <Expander.Header>
                    <Frame 
                            Padding="2"
                            Margin="5"
                            HasShadow="False"
                            BorderColor="#fdeec7"
                            CornerRadius="0">

                        <StackLayout
                                HorizontalOptions="FillAndExpand"
                                VerticalOptions="FillAndExpand"
                                Orientation="Horizontal">

                            <Label 
                                    Text="{Binding unit.title}"
                                    TextColor="Black"
                                    HorizontalOptions="Start" 
                                    HorizontalTextAlignment="Start"
                                    VerticalTextAlignment="Center"
                                    VerticalOptions="CenterAndExpand">
                                <Label.FontSize>
                                    <OnIdiom x:TypeArguments="x:Double">
                                        <OnIdiom.Phone>18</OnIdiom.Phone>
                                        <OnIdiom.Tablet>36</OnIdiom.Tablet>
                                        <OnIdiom.Desktop>18</OnIdiom.Desktop>
                                    </OnIdiom>
                                </Label.FontSize>
                            </Label>

                            <StackLayout.Margin>
                                <OnIdiom x:TypeArguments="Thickness">
                                    <OnIdiom.Phone>5</OnIdiom.Phone>
                                    <OnIdiom.Tablet>8</OnIdiom.Tablet>
                                    <OnIdiom.Desktop>5</OnIdiom.Desktop>
                                </OnIdiom>
                            </StackLayout.Margin>
                            <StackLayout.Padding>
                                <OnIdiom x:TypeArguments="Thickness">
                                    <OnIdiom.Phone>5</OnIdiom.Phone>
                                    <OnIdiom.Tablet>8</OnIdiom.Tablet>
                                    <OnIdiom.Desktop>5</OnIdiom.Desktop>
                                </OnIdiom>
                            </StackLayout.Padding>
                        </StackLayout>
                    </Frame>
                </Expander.Header>
                <Expander.ContentTemplate>
                    <DataTemplate>
                        <StackLayout BindableLayout.ItemsSource="{Binding contentList,Mode=TwoWay}">
                            <BindableLayout.ItemTemplate>
                                <DataTemplate>
                                <StackLayout 
                            Orientation="Horizontal">

                                    <Label
                                    HorizontalOptions="Start"
                                    Text="{Binding title}"
                                    VerticalOptions="CenterAndExpand"     
                                    TextColor="Black">
                                        <Label.FontSize>
                                            <OnIdiom x:TypeArguments="x:Double">
                                                <OnIdiom.Phone>16</OnIdiom.Phone>
                                                <OnIdiom.Tablet>32</OnIdiom.Tablet>
                                                <OnIdiom.Desktop>16</OnIdiom.Desktop>
                                            </OnIdiom>
                                        </Label.FontSize>
                                        <Label.GestureRecognizers>
                                                        <TapGestureRecognizer
                                                            Tapped="LoadChapter"
                                                            CommandParameter="{Binding .}"
                                                            NumberOfTapsRequired="1">
                                                        </TapGestureRecognizer>
                                                    </Label.GestureRecognizers>
                                    </Label>
                                </StackLayout>
                            </DataTemplate>
                            </BindableLayout.ItemTemplate>
                           
                        </StackLayout>
                    </DataTemplate>
                </Expander.ContentTemplate>
            </Expander>
        </DataTemplate>
    </BindableLayout.ItemTemplate>
</StackLayout>

使用此代码导航到页面时,我收到一个异常,指出我需要调用Xamarin.Forms.Forms.SetFlags("Expander_Experimental");,我已经public AppDelegate()在 MacOS 文件夹中的方法中添加了该调用。

    public AppDelegate()
    {
        Xamarin.Forms.Forms.SetFlags("Expander_Experimental");
        Xamarin.Forms.Forms.SetFlags("CarouselView_Experimental");

        var style = NSWindowStyle.Closable | NSWindowStyle.Miniaturizable | NSWindowStyle.Resizable | NSWindowStyle.Titled | NSWindowStyle.FullSizeContentView;
        var frame = NSScreen.MainScreen.Frame;
        var rect = NSWindow.FrameRectFor(frame, style);
        _window = new NSWindow(rect, style, NSBackingStore.Buffered, false);
        _window.MinSize = new CoreGraphics.CGSize(400, 300);
        _window.TitlebarAppearsTransparent = true;
        _window.MovableByWindowBackground = true;
        _window.AccessibilityMinimized = false;
    }

MacOS 不支持扩展器,还是我错过了关键步骤?

我也尝试在 DidFinishLaunching 方法中添加它,但没有区别。

    public override void DidFinishLaunching(NSNotification notification)
    {   
        Xamarin.Forms.Forms.SetFlags("Expander_Experimental");
        Xamarin.Forms.Forms.SetFlags("CarouselView_Experimental");

        Forms.Init();
        CachedImageRenderer.Init();
    ...

标签: c#xamarinxamarin.formsxamarin.mac

解决方案


在测试这个新组件时,我几乎自己也遇到了!如Xamarin.Forms 实验标志页面所述:

切勿SetFlags多次调用该方法,因为后续调用将覆盖先前调用的结果。

所以而不是:

Xamarin.Forms.Forms.SetFlags("Expander_Experimental");
Xamarin.Forms.Forms.SetFlags("CarouselView_Experimental"); // This call overwrites the `Expander_Experimental` flag set just above

调用一次,但带有两个标志:

Xamarin.Forms.Forms.SetFlags(new string[] { "Expander_Experimental", "CarouselView_Experimental" } );

推荐阅读