[XAMARIN] 가변길이 문자열 화면에 표현하기

2019. 5. 23. 22:42IT/C#

간단하게 날짜를 한국어랑 일본어로 읽는 방법을 표현해주는 어플을 만들어보겠다.

예를 들어 23일이면, "23 이십삼일 니쥬상" 같이 표현하고, 24일이면 "24 이십사일 니쥬욧까"로 표현한다. 날짜에 따라서 글자 크기가 자동으로 변하게 하려면 꼭 필요하다.

가변 길이 문자열 표시는 또한 스마트폰이 가로 모드 일때, 세로 모드일때 폭이 달라지므로 화면폭에 맞게 자동으로 글자 크기를 줄이면 디자인적으로도 매우 편리하다. 이게 없으면....각 문장마다 한번 실행하고 조절하고 이래야 된다. 수동적이기 때문에 이런 코드가 필요하다.

세로 모드일때
가로 모드일때

글자수에 따라서 한줄의 글자 크기를 자동으로 조절하는 방법은 아래와 같이 하면 된다.

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Xamarin.Forms;

namespace JPDate
{
    // Learn more about making custom code visible in the Xamarin.Forms previewer
    // by visiting https://aka.ms/xamarinforms-previewer
    [DesignTimeVisible(true)]
    public partial class MainPage : ContentPage
    {
        public MainPage()
        {
            InitializeComponent();

            lbl01.Text = DateTime.Now.ToString("d");

            string[] temp = lbl01.Text.Split('/');

            if(temp[1] == "23")
            {
                lbl01.Text = temp[1] + " 이십삼일 " + " にじゅうさん ";
            }

            if (temp[1] == "24")
            {
                lbl01.Text = temp[1] + " 이십사일 " + " にじゅうよっか ";
            }


            this.SizeChanged += Handle_SizeChanged;
        }

        void Handle_SizeChanged(object sender, EventArgs e)
        {
            double screenWidth = this.Width * 0.8;
            double charNumber = 0;

            char[] chars = lbl01.Text.ToCharArray();

            foreach (var item in chars)
            {
                if( (int)item >= 256)   // Unicode 
                {
                    charNumber += 1;


                }
                else    // Ascii code
                {
                    charNumber += 0.5;
                }

            }

            var fontSize = screenWidth / charNumber;
            lbl01.FontSize = fontSize;
        }

    }
}
<?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:JPDate" x:Class="JPDate.MainPage">
    <StackLayout>
        <!-- Place new controls here -->
        <Label x:Name="lbl01" HorizontalOptions="CenterAndExpand" VerticalOptions="CenterAndExpand" />
       
    </StackLayout>
</ContentPage>