【问题标题】:xamarin.forms set thickness in xamlxamarin.forms 在 xaml 中设置厚度
【发布时间】:2019-06-05 06:43:10
【问题描述】:

我有以下 XAML:

<ContentPage
    xmlns="http://xamarin.com/schemas/2014/forms"
    xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
    xmlns:local="clr-namespace:Foo"
    x:Class="Foo.MainPage">
<ContentPage.Padding>
    <OnPlatform x:TypeArguments="Thickness">
        <OnPlatform.iOS>0, 20, 0, 0</OnPlatform.iOS>
    </OnPlatform>
</ContentPage.Padding>
<StackLayout BindingContext="{x:Reference slider}"
             HorizontalOptions="Center">
    <BoxView Color="Green"
             Opacity="{Binding Value}" />
    <Label Text="{Binding Value,
           StringFormat='Value is {0:F2}' }"
           Opacity="{Binding Value }"/>
    <Slider x:Name="slider"/>
</StackLayout>

它正在尝试 - 并且失败 - 在 iOS 上将填充设置为顶部的 20 像素。非常简单,完全按照网上的建议 - 不起作用。填充仍然明显为 0 - 见下文。我真的看不出问题出在哪里 - 这是 XAML 的一个完全合理的部分,在你问之前,不,类似:

<ContentPage.Padding>
    <OnPlatform x:TypeArguments="Thickness">
        <On Platform="iOS" Value="0, 20, 0, 0" />
    </OnPlatform>
</ContentPage.Padding>

也不起作用。生成的代码:

// MainPage.xaml.g.cs

[global::Xamarin.Forms.Xaml.XamlFilePathAttribute("MainPage.xaml")]
public partial class MainPage : global::Xamarin.Forms.ContentPage {

    [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Xamarin.Forms.Build.Tasks.XamlG", "2.0.0.0")]
    private global::Xamarin.Forms.Slider slider;

    [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Xamarin.Forms.Build.Tasks.XamlG", "2.0.0.0")]
    private void InitializeComponent() {
        global::Xamarin.Forms.Xaml.Extensions.LoadFromXaml(this, typeof(MainPage));
        slider = global::Xamarin.Forms.NameScopeExtensions.FindByName<global::Xamarin.Forms.Slider>(this, "slider");
    }
}

图片:

有什么建议吗?对于它的价值,我知道我可以在 C# 中覆盖 OnAppearance,但我正在尝试通过保持 XAML 中的外观和 C# 中的逻辑来遵循更好的做法,这会造成不必要的困难。我真的希望 XAML 有更好的文档记录,这样的问题在编译时就被发现了,并且文档中的代码实际上做了它所说的:(

【问题讨论】:

    标签: c# xaml xamarin xamarin.forms


    【解决方案1】:

    您尝试处理的填充由 iOS + Xamarin.Forms 控制,称为 Safe Area,您可以通过要求 Xamarin.Forms 考虑该区域来控制它:

    xmlns:ios="clr-namespace:Xamarin.Forms.PlatformConfiguration.iOSSpecific;assembly=Xamarin.Forms.Core"
    ios:Page.UseSafeArea="true"
    

    <ContentPage
        xmlns="http://xamarin.com/schemas/2014/forms"
        xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
        xmlns:local="clr-namespace:Foo"
        x:Class="Foo.MainPage"
        xmlns:ios="clr-namespace:Xamarin.Forms.PlatformConfiguration.iOSSpecific;assembly=Xamarin.Forms.Core"
        ios:Page.UseSafeArea="true"
        BackgroundColor="Yellow">    
        <StackLayout BindingContext="{x:Reference slider}"
                     HorizontalOptions="Center"
                     BackgroundColor="Blue">
            <BoxView Color="Green"
                     Opacity="{Binding Value}"/>
            <Label Text="{Binding Value,
                   StringFormat='Value is {0:F2}' }"
                   Opacity="{Binding Value }"/>
            <Slider x:Name="slider"/>
        </StackLayout>
    </ContentPage>
    

    【讨论】:

    • 太棒了!解决了缺口,在我的机器上确实添加了填充。很棒的工作。也许 Xamarin 在安全区域和通用填充之间感到困惑。无论如何,您已经给出了一个很好的解决方案。非常感谢!
    【解决方案2】:

    玩了一些之后,我意识到这是一个实际的错误:当您将第二个值设置为 20 以外的任何值时,问题就消失了。

    ...为什么在地球上那是一个错误,我可能永远不会知道。任何阅读本文的人,非常欢迎您纠正我/给出更好的答案。

    【讨论】:

    • 这对我来说很好,适用于任何值,包括 20。使用 XF 3.6.0.344457
    • 我使用的是 XF 4.0.0.482894,所以也许这就是原因?公平地说,我也在 Mac 上
    • 如果你认为你在 XF Github 上找到了一个错误文件
    • 我想知道为什么这个答案被否决了。这是一个答案,虽然不是一个很好的答案,而且揭示潜在问题的答案很可能是一个实际的错误,我将报告它。无论谁投了反对票——除非是 Alexey——我希望你的代码能破解。
    猜你喜欢
    • 2013-07-19
    • 2016-12-08
    • 2021-01-21
    • 1970-01-01
    • 2016-07-26
    • 1970-01-01
    • 1970-01-01
    • 2016-11-27
    • 2014-08-10
    相关资源
    最近更新 更多