【问题标题】:How to add background image to Entry in Xamarin.Forms?如何将背景图像添加到 Xamarin.Forms 中的条目?
【发布时间】:2015-07-10 19:29:56
【问题描述】:

我的设计师创建了一个背景图像来设置输入的样式,如下所示:

如何在 Xamarin.Forms 中实现这一点? 我猜最简单的部分是删除边框,但我还需要将其放置在该图像的顶部(我假设使用RelativeLayout?)并且最难(在我看来)将其适当的大小设置为“填充" 图像的剩余部分。 我正在使用 XAML,但如果你知道 C#,我可以推断出来,没问题。 有什么想法吗?

编辑: 到目前为止,这是我设法做到的:

代码:

<RelativeLayout>
  <Image Source="input_selected.png"></Image>
  <StackLayout Orientation="Horizontal" HorizontalOptions="CenterAndExpand">
    <Image Source="ico_password.png" Scale="0.7"></Image>
    <Entry x:Name="PasswordT" Placeholder="Senha" IsPassword="True" HorizontalOptions="CenterAndExpand" Text=""></Entry>
  </StackLayout>
</RelativeLayout>

EDIT2:

<?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="LoginPage"
             Style="{StaticResource LoginBackground}">
  <ScrollView>
    <RelativeLayout x:Name="RelativeLayoutLogin">
      <StackLayout x:Name="BackgroundLayout" Spacing="15" HorizontalOptions="Center" VerticalOptions="Start">
        <StackLayout.Padding>
          <OnPlatform x:TypeArguments="Thickness" iOS="15, 38, 15, 15" Android="15, 18, 15, 15" WinPhone="15, 18, 15, 15" />
        </StackLayout.Padding>
        <StackLayout.Children>
          <Image Source="logo.png" Aspect="AspectFit" HeightRequest="75"></Image>
          <Image x:Name="BackgroundBox" Source="box_completo.png" Aspect="AspectFill"></Image>
        </StackLayout.Children>
      </StackLayout>

      <StackLayout RelativeLayout.YConstraint="{ConstraintExpression Type=RelativeToView, ElementName=BackgroundLayout, Property=Y, Constant=111}"
                   RelativeLayout.WidthConstraint="{ConstraintExpression Type=RelativeToView, ElementName=BackgroundLayout, Property=Width, Factor=1}">
        <!--<StackLayout.Padding>
          <OnPlatform x:TypeArguments="Thickness" iOS="15, 38, 15, 15" Android="15, 18, 15, 15" WinPhone="15, 18, 15, 15" />
        </StackLayout.Padding>-->
        <RelativeLayout>
          <Image Source="input.png" x:Name="BgUsername"></Image>
          <Image Source="input_selected.png" x:Name="SelectedBgUsername" IsVisible="False"></Image>
          <StackLayout RelativeLayout.XConstraint="{ConstraintExpression Type=Constant, Constant=8}"
                    RelativeLayout.YConstraint="{ConstraintExpression Type=Constant, Constant=8}"
                    RelativeLayout.WidthConstraint="{ConstraintExpression Type=RelativeToParent, Property=Width, Constant=-16}"
                    RelativeLayout.HeightConstraint="{ConstraintExpression Type=RelativeToParent, Property=Height, Constant=-16}"
                    Orientation="Horizontal">
            <Image Source="ico_user.png" Scale="0.6"></Image>
            <Entry x:Name="UsernameOrEmail" Placeholder="Nome de usuário" IsEnabled="True" HorizontalOptions="FillAndExpand" Text="" TextColor="Black"></Entry>
          </StackLayout>
        </RelativeLayout>
        <RelativeLayout>
          <Image Source="input.png" x:Name="BgPassword"></Image>
          <Image Source="input_selected.png" x:Name="SelectedBgPassword" IsVisible="False"></Image>
          <StackLayout RelativeLayout.XConstraint="{ConstraintExpression Type=Constant, Constant=8}"
                      RelativeLayout.YConstraint="{ConstraintExpression Type=Constant, Constant=8}"
                      RelativeLayout.WidthConstraint="{ConstraintExpression Type=RelativeToParent, Property=Width, Constant=-16}"
                      RelativeLayout.HeightConstraint="{ConstraintExpression Type=RelativeToParent, Property=Height, Constant=-16}"
                      Orientation="Horizontal">
            <Image Source="ico_password.png" Scale="0.6"></Image>
            <Entry x:Name="Password" Placeholder="Senha" IsPassword="True" HorizontalOptions="FillAndExpand" Text="" TextColor="Black"></Entry>
          </StackLayout>
        </RelativeLayout>
        <!--<RelativeLayout Scale="0.85">
          <Image Source="input.png" x:Name="BgUsername"></Image>
          <Image Source="input_selected.png" x:Name="SelectedBgUsername" IsVisible="False"></Image>
          <StackLayout Orientation="Horizontal" HorizontalOptions="CenterAndExpand" Padding="15, 5, 0, 0">
            <Image Source="ico_user.png" Scale="0.6"></Image>
            <Entry x:Name="UsernameOrEmail" Placeholder="Nome de usuário" IsEnabled="True" WidthRequest="300" HorizontalOptions="CenterAndExpand" Text="" TextColor="Black"></Entry>
          </StackLayout>
        </RelativeLayout>
        <RelativeLayout Scale="0.85">
          <Image Source="input.png" x:Name="BgPassword"></Image>
          <Image Source="input_selected.png" x:Name="SelectedBgPassword" IsVisible="False"></Image>
          <StackLayout Orientation="Horizontal" HorizontalOptions="CenterAndExpand" Padding="10, 5, 0, 0">
            <Image Source="ico_password.png" Scale="0.6"></Image>
            <Entry x:Name="Password" Placeholder="Senha" IsPassword="True" HorizontalOptions="CenterAndExpand" WidthRequest="300" Text="" TextColor="Black"></Entry>
          </StackLayout>
        </RelativeLayout>-->
        <Image x:Name="LoginButtonFm" Style="{StaticResource FmLoginButton}" Scale="0.85"></Image>
        <Label Text="OU" TextColor="Black" HorizontalOptions="CenterAndExpand"></Label>
        <Image x:Name="LoginButtonFacebook" Style="{StaticResource FacebookLoginButton}" Scale="0.85"></Image>
        <Image x:Name="LoginButtonGoogle" Style="{StaticResource GoogleLoginButton}" Scale="0.85"></Image>
        <Image x:Name="LoginButtonTwitter" Style="{StaticResource TwitterLoginButton}" Scale="0.85"></Image>
      </StackLayout>
    </RelativeLayout>
  </ScrollView>
</ContentPage>

谢谢!

【问题讨论】:

    标签: c# xaml xamarin xamarin.forms


    【解决方案1】:

    您绝对是在正确的轨道上。只需在RelativeLayout 中的Views 之一中添加一些约束即可。

    <RelativeLayout>
      <Image Source="input_selected.png"></Image>
        <StackLayout
          RelativeLayout.XConstraint="{ConstraintExpression Type=Constant, Constant=8}"
          RelativeLayout.YConstraint="{ConstraintExpression Type=Constant, Constant=8}"
          RelativeLayout.WidthConstraint="{ConstraintExpression Type=RelativeToParent, Property=Width, Constant=-16}"
          RelativeLayout.HeightConstraint="{ConstraintExpression Type=Constant, Constant=48}"
          Orientation="Horizontal">
          <Image Source="ico_password.png" Scale="0.7"></Image>
          <Entry x:Name="PasswordT" Placeholder="Senha" IsPassword="True" HorizontalOptions="FillAndExpand" Text="offspring"></Entry>
        </StackLayout>
    </RelativeLayout>
    

    这将定位 StackLayout 以填充整个 RelativeLayout,并在每一侧使用 8dpx 填充。那么因为Entry设置为FillAndExpand,它会占用StackLayout中所有未被ico_password占用的空间。

    【讨论】:

    • 谢谢乔尔,但我可能误解了一些东西......这是插入约束后的样子:i.imgur.com/T17J5d2.png 正如你所看到的,输入不仅推动了图标,而且还向下.
    • @eestein 很遗憾听到这不起作用。看起来 RelativeLayout 可能占用了整个空间,这取决于它所在的容器类型。如果你把它放在一个 StackLayout 中,并给它一个与尺寸匹配的 HeightRequest 和一个 WidthRequest(在 dip ) 的 input_selected.png,布局排列是否更好?
    • 嘿乔尔,请检查 EDIT2,这是我的完整代码。我能够使它看起来像这样:i.imgur.com/A2hWBwU.png 使用填充和缩放,正如您在注释代码中看到的那样,在测试您的代码之前,我注释了我的所有更改,这样它们就不会弄乱您的解决方案。看到代码有帮助吗?
    • @eestein 感谢您发布完整的 XAML。有机会我会在 VS 中启动它,看看我是否能弄清楚我错过了什么。
    • @eestein,我更新了答案以明确设置 StackLayout 的高度,而不是填充其容器,因为在同一个 RelativeLayout 中有多个 StackLayout。我不能确定没有图像资源它是否可以工作,因为它们在某些方面决定了布局,但我认为它可能会有所帮助。
    猜你喜欢
    • 2018-12-23
    • 1970-01-01
    • 2016-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-19
    相关资源
    最近更新 更多