Xamarinで名前(string)からUIコントロールを取得する方法
Xamarinで名前(string)からUIコントロールを取得する方法をご紹介します。
目次
条件
- Xamarin.Forms
 - Visual Studio 2019
 
実装方法
例として、Labelを取得する場合、以下のようにします。
Label resource = NameScopeExtensions.FindByName<Label>(this, "リソースID文字列");
実装例
以下のようなxamlが定義されているものとします。
MainPage.xaml
<?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:d="http://xamarin.com/schemas/2014/forms/design"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
             mc:Ignorable="d"
             x:Class="ResourceTest.MainPage">
    <StackLayout>
        <Label Text="テスト1" x:Name="resource1" HorizontalOptions="Center" VerticalOptions="CenterAndExpand" />
        <Label Text="テスト2" x:Name="resource2" HorizontalOptions="Center" VerticalOptions="CenterAndExpand" />
        <Label Text="テスト3" x:Name="resource3" HorizontalOptions="Center" VerticalOptions="CenterAndExpand" />
        <Label Text="テスト4" x:Name="resource4" HorizontalOptions="Center" VerticalOptions="CenterAndExpand" />
        <Label Text="テスト5" x:Name="resource5" HorizontalOptions="Center" VerticalOptions="CenterAndExpand" />
        <Label Text="テスト6" x:Name="resource6" HorizontalOptions="Center" VerticalOptions="CenterAndExpand" />
        <Label Text="テスト7" x:Name="resource7" HorizontalOptions="Center" VerticalOptions="CenterAndExpand" />
        <Label Text="テスト8" x:Name="resource8" HorizontalOptions="Center" VerticalOptions="CenterAndExpand" />
        <Label Text="テスト9" x:Name="resource9" HorizontalOptions="Center" VerticalOptions="CenterAndExpand" />
        <Label Text="テスト10" x:Name="resource10" HorizontalOptions="Center" VerticalOptions="CenterAndExpand" />
    </StackLayout>
</ContentPage>
何もしない場合
以下のように、ひたすら対象のUIコントロールについて値をセットするという記述になります。
MainPage.xaml.cs
using System.ComponentModel;
using Xamarin.Forms;
namespace ResourceTest
{
    // Learn more about making custom code visible in the Xamarin.Forms previewer
    // by visiting https://aka.ms/xamarinforms-previewer
    [DesignTimeVisible(false)]
    public partial class MainPage : ContentPage
    {
        public MainPage()
        {
            InitializeComponent();
            resource1.Text = "リソース1";
            resource2.Text = "リソース2";
            resource3.Text = "リソース3";
            resource4.Text = "リソース4";
            resource5.Text = "リソース5";
            resource6.Text = "リソース6";
            resource7.Text = "リソース7";
            resource8.Text = "リソース8";
            resource9.Text = "リソース9";
            resource10.Text = "リソース10";
        }
    }
}
文字列からUIコントロールを取得する場合
for文でいい感じに記述することが出来ます。
MainPage.xaml.cs
using System.ComponentModel;
using Xamarin.Forms;
namespace ResourceTest
{
    // Learn more about making custom code visible in the Xamarin.Forms previewer
    // by visiting https://aka.ms/xamarinforms-previewer
    [DesignTimeVisible(false)]
    public partial class MainPage : ContentPage
    {
        public MainPage()
        {
            InitializeComponent();
            for (int i = 0; i < 10; i++)
            {
                string strId = "resource" + (i + 1).ToString();
                Label resource = NameScopeExtensions.FindByName<Label>(this, strId);
                resource.Text = "リソース" + (i + 1).ToString();
            }
        }
    }
}
実行結果
各ラベルに指定した文字列がセットされていることがわかります。
(参考)Xamarin.Androidの場合
Xamarin.Androidで似たようなことを行う場合、以下のようにしてResourceIdを取得することが出来ます。
var resourceId = (int)typeof(Resource.Id).GetField("リソースID文字列").GetValue(null);
参考
How do I set the x:Name property of a UI control that I created in code?
stackoverflow:Return id of resource, if i know name of resource
https://stackoverflow.com/questions/13038895/return-id-of-resource-if-i-know-name-of-resource



