TargetName으로 시각적 상태 관리자 단순화 | 아이포 테크노랩

시각적 상태 관리자란 무엇입니까?



VSM(Visual State Manager)은 코드에서 사용자 인터페이스에 대한 컨트롤을 일부 변경하는 구조화된 방법이며 시각적 상태 관리자는 시각적 상태의 개념입니다. 모든 사용자 인터페이스는 XAML에 정의되어 있으므로 XAML에 시각적 상태 관리자 효과를 포함할 수 있습니다. 고유한 컨트롤을 만들기 위해 모든 XAML 컨트롤에 시각적 상태 관리자 효과를 적용할 수 있습니다. 버튼의 예를 들어 보겠습니다. 버튼은 비활성화되었거나 입력 포커스가 있는지 여부에 관계없이 눌린 버튼과 같이 다양한 시각적 모양을 갖습니다.

"CommonStates"는 Visual State Manager에 정의된 시각적 상태 그룹입니다. 다음과 같은 시각적 상태가 있습니다.
  • "정상"
  • "선택됨"
  • "집중"
  • "비활성화됨"

  • VisualElement는 Page 및 View의 기본 클래스이며 시각적 상태 그룹은 VisualElement에서 파생된 클래스만 지원합니다.

    트리거와 시각적 상태 관리자는 모두 동일하지만 차이점은 트리거를 사용하여 이벤트 및 속성을 기반으로 Ui를 변경할 수도 있다는 것입니다. 그러나 시각적 상태 관리자에서는 상태를 기반으로 Ui를 변경할 수 있습니다. 사용하기 쉽고 구조가 덜 혼란스럽습니다.

    공통 상태



    XAML에서 보기가 비활성화되었거나 정상이거나 입력 포커스가 있는 경우 이를 공통 상태라고 합니다.

    
                    <entry fontsize="15">
                      <visualstatemanager.visualstategroups>
                          <visualstategroup x:name="GroupedStates">
                              <visualstate x:name="Normal">
                              </visualstate>
                              <visualstate x:name="Focused">
                              </visualstate>
                              <visualstate x:name="Disabled">
                              </visualstate>
                          </visualstategroup>
                      </visualstatemanager.visualstategroups>
          </entry>
    
    


    이것은 시각적 상태 관리자를 사용하는 방법의 예일 뿐입니다. 시각적 상태 그룹은 한 쌍의 시각적 상태를 포함할 수 있는 일반적인 그룹 상태입니다. 그런 다음 시각적 상태에서 setter 속성을 정의할 수 있습니다. 아래와 같이 시각적 상태와 VisualState.Setter 내에서 setter 속성을 사용할 수 있습니다.

    
                    <entry fontsize="15">
                      <visualstatemanager.visualstategroups>
                          <visualstategroup x:name="GroupedStates">
                              <visualstate x:name="Normal">
                                  <visualstate.setters>
                                      <setter property="BackgroundColor" value="Gray">
                                  </setter></visualstate.setters>
                              </visualstate>
                              <visualstate x:name="Focused">
                                  <visualstate.setters>
                                      <setter property="FontSize" value="30">
                                  </setter></visualstate.setters>
                              </visualstate>
                              <visualstate x:name="Disabled">
                                  <visualstate.setters>
                                      <setter property="BackgroundColor" value="Green">
                                  </setter></visualstate.setters>
                              </visualstate>
                          </visualstategroup>
                      </visualstatemanager.visualstategroups>
          </entry>
    
    


    이제 시각적 상태 관리자를 사용하여 간단한 항목 예제를 볼 수 있습니다.

    
      <contentpage x:class="VisualState.MainPage" xmlns="http://xamarin.com/schemas/2014/forms" xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml">
    
        <entry placeholder="Write your name">
            <visualstatemanager.visualstategroups>
                <visualstategroup x:name="CommonStates">
                    <visualstate x:name="Normal">
                        <visualstate.setters>
                            <setter property="BackgroundColor" value="#FFDBBA">
                            <setter property="TextColor" value="#FF00B6">
                            <setter property="FontSize" value="25">
                        </setter></setter></setter></visualstate.setters>
                    </visualstate>
                    <visualstate x:name="Focused">
                        <visualstate.setters>
                            <setter property="HeightRequest" value="80">
                            <setter property="TextColor" value="#9700FF">
                            <setter property="BackgroundColor" value="#FFE6FF">
                            <setter property="FontSize" value="35">
                        </setter></setter></setter></setter></visualstate.setters>
                    </visualstate>
                    <visualstate x:name="Disabled">
                        <visualstate.setters>
                            <setter property="BackgroundColor" value="#9700FF">
                        </setter></visualstate.setters>
                    </visualstate>
                </visualstategroup>
            </visualstatemanager.visualstategroups>
        </entry>
    
    </contentpage>
    
    


    여기에서 시각적 상태 그룹 및 VisualState.Setter와 함께 Entry 컨트롤을 추가할 수 있습니다. VisualState.Setter 내부에 다른 setter 속성을 추가하여 항목의 배경색, 글꼴 크기, 텍스트 색 및 높이를 설정할 수 있습니다.

    자세히 보기: Office 추가 기능에서 XML 매니페스트란 무엇입니까?



    이 예에서 예를 들어 일부 데이터를 입력하면 항목의 높이와 색상이 변경되고 포커스를 제거하면 다시 변경되는 항목을 만들었습니다.

    산출

    이미지: Visual State Manager 항목

    이미지: 변경된 항목 제어

    이미지: 마우스 오버 후 효과

    이제 하나의 항목 컨트롤이 있는 예제를 만들 수 있고 일부 조건이 있는 3개의 항목 컨트롤이 있는 예제를 만들 수 있습니다.

    
      <!--?xml version="1.0" encoding="utf-8" ?-->
    <contentpage x:class="VisualState.MainPage" xmlns="http://xamarin.com/schemas/2014/forms" xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml">
      <stacklayout>
              <stacklayout.resources><style targettype="Entry" type="text/css"><Setter Property="Margin" Value="20, 0" />
                      <Setter Property="FontSize" Value="18" />
                      <Setter Property="VisualStateManager.VisualStateGroups">
                          <VisualStateGroupList>
                              <VisualStateGroup x:Name="CommonStates">
                                  <VisualState x:Name="Normal">
                                      <VisualState.Setters>
                                          <Setter Property="BackgroundColor" Value="Lime" />
                                      </VisualState.Setters>
                                  </VisualState>
                                  <VisualState x:Name="Focused">
                                      <VisualState.Setters>
                                          <Setter Property="FontSize" Value="36" />
                                          <Setter Property="BackgroundColor" Value="Lime" />
                                      </VisualState.Setters>
                                  </VisualState>
                                  <VisualState x:Name="Disabled">
                                      <VisualState.Setters>
                                          <Setter Property="BackgroundColor" Value="Pink" />
                                      </VisualState.Setters>
                                  </VisualState>
                              </VisualStateGroup>
                          </VisualStateGroupList>
                      </Setter></style><style targettype="Label" type="text/css"><Setter Property="Margin" Value="20, 30, 20, 0" />
                      <Setter Property="FontSize" Value="Large" /></style>
              </stacklayout.resources>
              <label text="Normal Entry:">
              <entry>
              <label text="Entry with VSM: ">
              <entry>
                  <entry.triggers>
                      <datatrigger binding="{Binding Source={x:Reference entry3},
                                                 Path=Text.Length}" targettype="Entry" value="0">
                          <setter property="IsEnabled" value="False">
                      </setter></datatrigger>
                  </entry.triggers>
              </entry>
              <label text="Entry to enable 2nd Entry:">
              <entry placeholder="Type something to enable 2nd Entry" text="" x:name="entry3">
          </entry></label></label></entry></label></stacklayout>
    </contentpage>
    
    


    이 예에서 세 개의 입력 컨트롤을 추가할 수 있습니다. 첫 번째 입력 컨트롤은 일반 입력 컨트롤이 되고, 두 번째 입력 컨트롤은 세 번째 입력 컨트롤에 무언가를 입력할 때 비활성화됩니다. 그런 다음 두 번째 입력 컨트롤이 활성화되고 다음에서 텍스트를 제거할 수 있습니다. 세 번째 항목 제어 두 번째 항목 제어가 비활성화됩니다.

    산출

    이미지: Visual State Manager를 사용한 다중 항목 제어

    이미지: 일부 조건이 있는 항목 제어

    이미지: 활성화된 두 번째 항목 제어

    이 예제 후에 코드 숨김을 사용하여 몇 가지 조건이 있는 예제를 하나 더 만들었습니다.

    최고의 맞춤형 소프트웨어 개발 회사를 찾고 계십니까? 귀하의 검색은 여기서 끝납니다.



    MainPage.Xaml

    
    <!--?xml version="1.0" encoding="utf-8" ?-->
    <contentpage x:class="VisualState.MainPage" xmlns="http://xamarin.com/schemas/2014/forms" xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml">
    
      <stacklayout padding="10, 10" x:name="stackLayout">
          <visualstatemanager.visualstategroups>
              <visualstategroup name="ValidityStates">
                  <visualstate name="Valid">
                      <visualstate.setters>
                          <setter property="Label.TextColor" targetname="helpLabel" value="Transparent">
                          <setter property="Entry.BackgroundColor" targetname="entry" value="Lime">
                      </setter></setter></visualstate.setters>
                  </visualstate>
                  <visualstate name="Invalid">
                      <visualstate.setters>
                          <setter property="Entry.BackgroundColor" targetname="entry" value="Pink">
                          <setter property="Button.IsEnabled" targetname="submitButton" value="False">
                      </setter></setter></visualstate.setters>
                  </visualstate>
              </visualstategroup>
          </visualstatemanager.visualstategroups>
          <label fontsize="Large" text="Enter phone number:">
          <entry fontsize="Large" margin="30, 0, 0, 0" placeholder="555-555-5555" textchanged="OnTextChanged" x:name="entry">
          <label text="Phone number must have the displayed format, and not begin with a 0 or 1" x:name="helpLabel"><button fontsize="Large" horizontaloptions="Center" margin="0, 20" text="Submit" verticaloptions="Center" x:name="submitButton"></button></label></entry></label></stacklayout></contentpage>
    
    


    Mainpage.Xaml.cs

    
      using System;
      using System.Collections.Generic;
      using System.ComponentModel;
      using System.Linq;
      using System.Text;
      using System.Text.RegularExpressions;
      using System.Threading.Tasks;
      using Xamarin.Forms;
      namespace VisualState
      {
          public partial class MainPage : ContentPage
          {
              public MainPage()
              {
                  InitializeComponent();
                  Validation(false);
              }
              private void OnTextChanged(object sender, TextChangedEventArgs e)
              {
                  bool isValid = Regex.IsMatch(e.NewTextValue, @"^[2-9]\d{2}-\d{3}-\d{4}$");
                  Validation(isValid);
              }
              void Validation(bool isValid)
              {
                  string VSM = isValid ? "Valid" : "Invalid";
                  VisualStateManager.GoToState(stackLayout, VSM);
              }
          }
      }
    
    


    이 예에서 사용자가 유효한 숫자 형식을 입력하지 않으면 버튼이 비활성화되고 사용자가 유효한 숫자를 입력하면 버튼이 활성화될 때 시각적 상태 관리자를 사용하여 버튼 가시성을 설정할 수 있습니다.

    산출

    이미지: 제출 버튼 비활성화

    이미지: 0 또는 1로 시작할 수 없음

    이미지: 제출 버튼 활성화됨

    결론



    이 블로그에서는 제어를 설계하는 구조화된 방법인 시각적 상태 관리자를 배웠습니다. 항목 컨트롤에 무언가를 입력할 때 항목 컨트롤의 높이를 늘리고 싶다고 가정합니다. 그리고 조건에 따라 텍스트 색상이나 항목 색상을 설정할 수도 있습니다. 또한 제어가 집중될 때 입력 제어의 색상을 변경하십시오.

    좋은 웹페이지 즐겨찾기