【问题标题】:Xamarin.Forms adding Effect to all Entries in XAMLXamarin.Forms 为 XAML 中的所有条目添加效果
【发布时间】:2017-03-24 17:11:38
【问题描述】:

我正在使用 FormsCommunityToolkit NuGet 包来制作它,以便我的 Xamarin.Forms 应用程序中的所有条目在用户单击它们时选择它们的所有文本。 their GitHub 在 XAML 中对 Entry 使用此效果的示例如下:

<Entry Placeholder="focus this entry." VerticalOptions="Start" Text = "FOCUS THIS!">
  <Entry.Effects>
    <effects:SelectAllTextEntryEffect />
  </Entry.Effects>
</Entry>

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

<Style TargetType="Entry">
    <Setter Property="Keyboard" Value="Text"/> <!--Defaults to capitalize first word-->
    <Setter Property="Effects" Value="effects:SelectAllTextEntryEffect" />
</Style>

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

Can't resolve EffectsProperty on Entry

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

【问题讨论】:

    标签: c# xaml xamarin xamarin.forms


    【解决方案1】:

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

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

    <Entry>
      <Entry.Effects>
        <effects:SelectAllTextEntryEffect />
      </Entry.Effects>
    </Entry>
    

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

    namespace MyApp.Controls
    {
        public partial class EffectEntry : Button
        {
            public EffectEntry ()
            {
                InitializeComponent ();
            }
        }
    }
    

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

    <controls:EffectEntry Placeholder="focus this entry." VerticalOptions="Start" Text = "FOCUS THIS!" />
    

    请注意,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>
    

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

    【讨论】:

    • 我设置了这一切并得到以下错误:“Xamarin.Forms.Xaml.XamlParseException:位置 96:121。找不到键 selectAllEntry 的静态资源”。我使用本地、控件和效果条目在我的页面中设置命名空间。我的 EffectEntry Xaml 中还有效果的命名空间。知道我做错了什么吗?
    • 该错误与以这种方式实现条目无关。听起来您正在尝试使用无法找到的静态资源(在您的 XAML 中找到 {StaticResource selectAllEntry})。确保在使用 selectAllEntry 资源的页面中包含资源字典
    • 有这方面的文档吗?我相信这是正确的答案,我只是对如何实现它感到困惑。
    • 不看剩下的代码很难说。但在我看来,错误在于其他地方。也许在您的App.xaml 中您仍然定义了某种样式。在您的代码中查找 selectAllEntry 键。由于错误表明了这一点,因此那里似乎有问题。
    猜你喜欢
    • 2017-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多