xamarin 如何通过.Net MAUI中的代码访问资源字典中定义的控件?

vsdwdz23  于 2023-05-11  发布在  .NET
关注(0)|答案(1)|浏览(164)

这是我的.net maui项目ResourceDictionary。我在这里创建了ControlTemplate来全局使用它。

<ResourceDictionary 
    xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
    xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
    xmlns:ctrls="clr-namespace:Mobile.UI.Core.Controls;Mobile.UI.Core"
    x:Class="Mobile.UI.Core.Resources.CommonStyles">

 <!-- ControlTemplate -->
     <ControlTemplate x:Key="EntryFieldTemplate">
        <StackLayout
            ClassId="_entryFieldLayout"
            HorizontalOptions="{TemplateBinding Path=HorizontalOptions}"
            Orientation="Vertical"
            VerticalOptions="{TemplateBinding Path=VerticalOptions}"
            WidthRequest="{TemplateBinding Path=WidthRequest}">

            <Label
                x:Name="_entryFieldLabel"
                AutomationId="_entryFieldLabel"
                Style="{TemplateBinding Path=LabelTextStyle}"
                Text="{TemplateBinding Path=LabelText}" />

            <BoxView
                AutomationId="BoxViewPlaceholder"
                Style="{DynamicResource Key=LabeledFieldPlaceholderBoxViewStyle}" />

            <Entry
                x:Name="_entryFieldEntry"
                AutomationId="_entryFieldEntry"
                HeightRequest="25"
                Text="{TemplateBinding Path=Text, Mode=TwoWay}" />

        </StackLayout>
    </ControlTemplate>

</ResourceDictionary>

我想使用c#代码从自定义控件类访问具有x:Name =“_entryFieldEntry”的Entry控件。

我可以使用以下代码访问ControlTemplate:

var controlTemplate = Application.Current.Resources.TryGetValue("EntryFieldTemplate", 
out var controlTemplate);

我们不能直接使用Resources.TryGetValue()进行Entry控制,因为没有x:Key属性可供声明。
我想访问我在collectionView中获取的ControlTemplate的CollectionItems。
我做了研发,但没有找到任何解决方案,以访问进入控制。我尝试使用FindByName()方法,但它不工作。
有人知道怎么做吗?任何形式的帮助都将不胜感激。

2023年5月5日更新:

我能够使用代码访问ControlTemplate,我可以看到我所采取的控件正在显示在其中,但我无法访问它。

var entryFieldTemplate = Application.Current.Resources.MergedDictionaries.
FirstOrDefault(rd => rd.ContainsKey("EntryFieldTemplate"));
 var template = (ControlTemplate)entryFieldTemplate["EntryFieldTemplate"];
 var collectionView = template.LoadTemplate.Target;

当试图从collectionView访问node时,我没有得到任何方法。它只显示了五个选项:

  • 等于
  • GetHasCode
  • GetType
  • LoadFromXaml<>
  • ToString

ztigrdn8

ztigrdn81#

示例化控件模板后,将调用模板的OnApplyTemplate方法。然后你可以使用GetTemplateChild方法来获取命名的控件。

protected override void OnApplyTemplate()
{
    base.OnApplyTemplate();
    var entry = this.GetTemplateChild("_entryFieldEntry");
}

有关更多信息,您可以参考从模板获取命名元素。

相关问题