Xamarin.Forms为XAML中的所有条目添加效果

cva*_*eek 5 c# xaml xamarin xamarin.forms

我正在使用FormsCommunityToolkit NuGet包来使我的Xamarin.Forms应用程序中的所有条目在用户点击它们时选择所有文本.他们的GitHub上的例子Entry在XAML中使用这个效果是这样的:

<Entry Placeholder="focus this entry." VerticalOptions="Start" Text = "FOCUS THIS!">
  <Entry.Effects>
    <effects:SelectAllTextEntryEffect />
  </Entry.Effects>
</Entry>
Run Code Online (Sandbox Code Playgroud)

如果你把它放在Entry你的代码中的每个人身上,这是有效的,但我有很多条目,并希望将其设置为我的App.xaml文件夹中的默认值.我试过这个:

<Style TargetType="Entry">
    <Setter Property="Keyboard" Value="Text"/> <!--Defaults to capitalize first word-->
    <Setter Property="Effects" Value="effects:SelectAllTextEntryEffect" />
</Style>
Run Code Online (Sandbox Code Playgroud)

此方法适用于设置Keyboard所有条目的默认值,但以这种方式设置效果会使应用程序崩溃,并显示以下错误:

Can't resolve EffectsProperty on Entry
Run Code Online (Sandbox Code Playgroud)

有没有人知道这样做的方法所以我不需要将代码添加到我的所有条目中?

Ger*_*uis 4

为什么不创建自己的Entry具有效果的呢?

因此创建一个继承Entry,我将调用它EffectEntry。您可以通过创建一个新的 XAML 文件并将内容放入Entry其中来完成此操作。您可能想要删除PlaceHolder和之类的属性Text,但如果您希望所有条目都有一个默认属性,请在此处应用它们。

<Entry>
  <Entry.Effects>
    <effects:SelectAllTextEntryEffect />
  </Entry.Effects>
</Entry>
Run Code Online (Sandbox Code Playgroud)

转到代码隐藏并确保您EffectEntry继承了Entry.

namespace MyApp.Controls
{
    public partial class EffectEntry : Button
    {
        public EffectEntry ()
        {
            InitializeComponent ();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

现在,在应用程序的其余部分中,您可以使用Entry已添加的效果,如下所示:

<controls:EffectEntry Placeholder="focus this entry." VerticalOptions="Start" Text = "FOCUS THIS!" />
Run Code Online (Sandbox Code Playgroud)

请注意,这controls是您必须自己添加的命名空间。名称可能不同。在整个页面的上下文中,它可能如下所示:

<?xml version="1.0" encoding="utf-8"?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms" 
    xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" 
    xmlns:local="clr-namespace:MyApp"
    xmlns:controls="clr-namespace:MyApp.Controls" 
    x:Class="MyApp.MyAppPage">

    <controls:EffectEntry Placeholder="focus this entry." VerticalOptions="Start" Text = "FOCUS THIS!" />
</ContentPage>
Run Code Online (Sandbox Code Playgroud)

xmlns请注意顶部有多个(XML 命名空间)条目。我已经添加了控件,您也可以将其命名为您喜欢的任何其他方式。当您查看我们的隐藏代码时EffectEntry,您将看到那里的命名空间和这里的命名空间匹配。这样应用程序就知道在哪里可以找到控件。如果您决定要将控件移动到它们自己的程序集中,您也可以像这样定义它xmlns:controls="clr-namespace:MyApp.Controls;assembly=MyProject.Example"