WPF 상에서 IE를 기동한뒤에

화면이 종료되면, 기동했던 IE 페이지도 타이틀에 따라서 따로 종료해야하는 상황이 발생했다.


어떻게 제어를 해야하나...


[조건]

웹브라우져는 IE로 한정된다.

화면이 종료되는 시점에서 브라우져를 같이 종료해야한다.

종료시켜야하는 브라우져의 타이틀은 가변적이다.

  예) "우리나라 만세 [회원아이디]"


[진행]

우선, 참조설정 COM에서 아래를 추가한다.

Microsoft Internet Controls

Microsoft Shell Controls And Automation


그리고 Using 을 추가한다.

using SHDocVw;

using Shell32;


마지막으로 소스를 아래와같이 구현해보았더니, 아주 잘 작동된다.




/// <summary>

/// IE기동 (타이틀취득)

/// </summary>

protected void IECloseControlExecute()

{

    Shell shell = new Shell();

    IShellWindows windows = (SHDocVw.IShellWindows)shell.Windows();


    // 아래의 키가 포함되어있으면 브라우져를 종료한다.

    string targetKey = "우리나라 만세";

    SHDocVw.InternetExplorer ie;

    foreach (object window in windows)

    {

        ie = window as SHDocVw.InternetExplorer;

        if (ie != null &&

            string.Equals(System.IO.Path.GetFileName(ie.FullName),

            "iexplore.exe", StringComparison.CurrentCultureIgnoreCase))

        {

            if(ie.LocationName.IndexOf(targetKey) > -1)

            {

                ie.Quit();

            }

        }

    }


물론, WPF(C#) 을 베이스로 활용하였지만

소스자체는 C#이라 윈도우 기반에서도 활용 가능할것으로 보인다.


WPF 의 경우 TextBox 컨트롤의 Enabled 속성을 False 로 하게되면,

ForeColor 또는 BackGround 설정이 먹히지 않는다.

Enabled = False 설정으로 인해서 TextBox의 모든 설정이 Windows Default 로 막혀버리기 때문이다.


이 문제를 해결하기 위해서

IsReadOnly 속성을 이용해서 해결이 가능하다.

예를 들어서,

TextBox 에 입력은 안되게 하고, 배경색만 Gray 로 하고싶다면,


IsReadOnly="True" 

BackGround = "Gray"


로 설정하면 된다.


또한, 이렇게 설정하게되면

Enabled = False 시에는 되지않았던, 스크롤문제도 해결할수있다.

비활성 되어있는경우는 MultyTextLine으로 복수행 데이터 입력이 되어있다 하더라도, 스크롤을 제어할수가 없게된다.

이 문제역시 위와같은 방법으로 

마치, Enabled = false 제어가 된듯한 효과를 기대할수 있다.

wfp 개발을 하다보면, UserControl 을 수정해야할지... 

Style 적용으로 Trigger 설정을 해야할지 막막할때가 참 많다.


어느쪽이 정답이라고 말할수는 없으나

현재 프로젝트의 성능을 고려했을때 가장 적합한 방법으로 사용하는것이 좋을듯하다.

이번에는 DependencyProperty 를 사용한 경우의 예를 간단하게 들어볼까한다.


예를들어, UserControl (Label / TextBox / DataGrid)를 가지고 있는 컨트롤이 하나 있다고 하자.


DependencyProperty 를 추가해서 사용하는 경우는 아래와같은 처리를 해야한다.



        public static readonly DependencyProperty DataGridSelectionModeProperty = DependencyProperty.Register

        (

                    "DataGridSelectionMode",

                    typeof(DataGridSelectionMode),

                    typeof(UserControlDataGridBase),

                    new FrameworkPropertyMetadata(DataGridSelectionMode.Extended, new PropertyChangedCallback(UserControlDataGridBase.OnDataGridSelectionModeChanged))

        );


        public DataGridSelectionMode DataGridSelectionMode

        {

            get { return (DataGridSelectionMode)GetValue(DataGridSelectionModeProperty); }

            set

            {

                SetValue(DataGridSelectionModeProperty, value);

            }

        }


        private static void OnDataGridSelectionModeChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)

        {

            (d as UserControlDataGridBase).DataGridSelectionMode = (DataGridSelectionMode)e.NewValue;

        }


여기서 외부공개용인 DataGridSelectionMode 를 View에서 설정하게 된다.


위의예는 DataGridSelectionMode 를 설정하는 DependencyProperty  이므로 상황에맞게 설정하면 되겠다.


+ Recent posts