첨부 실행 코드는 나눔고딕코딩 폰트를 사용합니다.
728x90
반응형
728x170

■ FrameworkElement 엘리먼트에서 XAML을 사용해 포커스를 설정하는 방법을 보여준다.

TestProject.zip
0.00MB

▶ FrameworkElementExtension.cs

using System;
using System.Windows;

namespace TestProject;

/// <summary>
/// 프레임워크 엘리먼트 확장
/// </summary>
public static class FrameworkElementExtension
{
    //////////////////////////////////////////////////////////////////////////////////////////////////// Dependency Property
    ////////////////////////////////////////////////////////////////////////////////////////// Static
    //////////////////////////////////////////////////////////////////////////////// Public

    #region 포커스 여부 속성 - IsFocusedProperty

    /// <summary>
    /// 포커스 여부 속성
    /// </summary>
    public static readonly DependencyProperty IsFocusedProperty = DependencyProperty.RegisterAttached
    (
        "IsFocused",
        typeof(bool?),
        typeof(FrameworkElementExtension),
        new FrameworkPropertyMetadata(IsFocusedPropertyChangedCallback)
        {
            BindsTwoWayByDefault = true
        }
    );

    #endregion

    //////////////////////////////////////////////////////////////////////////////////////////////////// Method
    ////////////////////////////////////////////////////////////////////////////////////////// Static
    //////////////////////////////////////////////////////////////////////////////// Public

    #region 포커스 여부 구하기 - GetIsFocused(d)

    /// <summary>
    /// 포커스 여부 구하기
    /// </summary>
    /// <param name="d">의존 객체</param>
    /// <returns>포커스 여부</returns>
    public static bool? GetIsFocused(DependencyObject d)
    {
        if(d == null)
        {
            throw new ArgumentNullException("d");
        }

        return (bool?)d.GetValue(IsFocusedProperty);
    }

    #endregion
    #region 포커스 여부 설정하기 - SetIsFocused(d, value)

    /// <summary>
    /// 포커스 여부 설정하기
    /// </summary>
    /// <param name="d">의존 객체</param>
    /// <param name="value">값</param>
    public static void SetIsFocused(DependencyObject d, bool? value)
    {
        if(d == null)
        {
            throw new ArgumentNullException("d");
        }

        d.SetValue(IsFocusedProperty, value);
    }

    #endregion

    //////////////////////////////////////////////////////////////////////////////// Private

    #region 프레임워크 엘리먼트 포커스 획득시 처리하기 - frameworkElement_GotFocus(sender, e)

    /// <summary>
    /// 프레임워크 엘리먼트 포커스 획득시 처리하기
    /// </summary>
    /// <param name="sender">이벤트 발생자</param>
    /// <param name="e">이벤트 인자</param>
    private static void frameworkElement_GotFocus(object sender, RoutedEventArgs e)
    {
        ((FrameworkElement)sender).SetValue(IsFocusedProperty, true);
    }

    #endregion
    #region 프레임워크 엘리먼트 포커스 상실시 처리하기 - frameworkElement_LostFocus(sender, e)

    /// <summary>
    /// 프레임워크 엘리먼트 포커스 상실시 처리하기
    /// </summary>
    /// <param name="sender">이벤트 발생자</param>
    /// <param name="e">이벤트 인자</param>
    private static void frameworkElement_LostFocus(object sender, RoutedEventArgs e)
    {
        ((FrameworkElement)sender).SetValue(IsFocusedProperty, false);
    }

    #endregion
    #region 프레임워크 엘리먼트 표시 여부 변경시 처리하기 - frameworkElement_IsVisibleChanged(sender, e)

    /// <summary>
    /// 프레임워크 엘리먼트 표시 여부 변경시 처리하기
    /// </summary>
    /// <param name="sender">이벤트 발생자</param>
    /// <param name="e">이벤트 인자</param>
    private static void frameworkElement_IsVisibleChanged(object sender, DependencyPropertyChangedEventArgs e)
    {
        FrameworkElement frameworkElement = sender as FrameworkElement;

        if(frameworkElement.IsVisible && (bool)((FrameworkElement)sender).GetValue(IsFocusedProperty))
        {
            frameworkElement.IsVisibleChanged -= frameworkElement_IsVisibleChanged;

            frameworkElement.Focus();
        }
    }

    #endregion

    #region 포커스 여부 속성 변경시 콜백 처리하기 - IsFocusedPropertyChangedCallback(d, e)

    /// <summary>
    /// 포커스 여부 속성 변경시 콜백 처리하기
    /// </summary>
    /// <param name="d">의존 객체</param>
    /// <param name="e">이벤트 인자</param>
    private static void IsFocusedPropertyChangedCallback(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        FrameworkElement frameworkElement = d as FrameworkElement;

        if(e.OldValue == null)
        {
            frameworkElement.GotFocus  -= frameworkElement_GotFocus;
            frameworkElement.GotFocus  += frameworkElement_GotFocus;

            frameworkElement.LostFocus -= frameworkElement_LostFocus;
            frameworkElement.LostFocus += frameworkElement_LostFocus;
        }

        if(!frameworkElement.IsVisible)
        {
            frameworkElement.IsVisibleChanged -= frameworkElement_IsVisibleChanged;
            frameworkElement.IsVisibleChanged += frameworkElement_IsVisibleChanged;
        }

        if((bool)e.NewValue)
        {
            frameworkElement.Focus();
        }
    }

    #endregion
}

 

▶ MainWindow.xaml

<Window x:Class="TestProject.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:TestProject"
    Width="800"
    Height="600"
    Title="TestProject"
    FontFamily="나눔고딕코딩"
    FontSize="16">
    <StackPanel
        HorizontalAlignment="Center"
        VerticalAlignment="Center">
        <TextBox
            Width="200"
            Height="25"
            VerticalContentAlignment="Center" />
        <TextBox
            Margin="0 10 0 0"
            Width="200"
            Height="25"
            local:FrameworkElementExtension.IsFocused="True"
            VerticalContentAlignment="Center" />
    </StackPanel>
</Window>
728x90
반응형
그리드형(광고전용)
Posted by icodebroker

댓글을 달아 주세요