๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
์–ธ์–ด/C#. JAVA

[.NET] IExtenderProvider Interface (feat.ToolTip)

by lee365 2021. 4. 5.
๋ฐ˜์‘ํ˜•

๐Ÿ“š ToolTip ์ปจํŠธ๋กค

ToolTip ์ปจํŠธ๋กค์€ Form์— ToolTip ์ปจํŠธ๋กค์„ ์ถ”๊ฐ€ํ–ˆ์„ ๋•Œ,

๋‹ค๋ฅธ ์ปจํŠธ๋กค๋“ค์— ๊ณตํ†ต์ ์œผ๋กœ tooltip1์˜ ToolTip ์ด๋ผ๋Š” ํ”„๋กœํผํ‹ฐ๊ฐ€ ์ƒ๊ธด๋‹ค.

 

๐Ÿ”บForm์— ToolTip ์ปจํŠธ๋กค์„ ์ถ”๊ฐ€ํ–ˆ์„ ๋•Œ Button์˜ ์†์„ฑ์— toolTip1์˜ ToolTip์ด๋ผ๋Š” ํ”„๋กœํผํ‹ฐ๊ฐ€ ์ƒ๊ธด ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

 

ToolTip ํด๋ž˜์Šค๋Š” Component ํด๋ž˜์Šค์™€ IExtenderProvider ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ƒ์†๋ฐ›๊ณ  ์žˆ๋Š”๋ฐ ์—ฌ๊ธฐ์„œ ํ”„๋กœํผํ‹ฐ ํ™•์žฅ์„ ํ•˜๊ธฐ ์œ„ํ•œ ์ธํ„ฐํŽ˜์ด์Šค์ธ IExtenderProvider ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ดํŽด๋ณผ ๊ฒƒ์ด๋‹ค.

 

๐Ÿ“– IExtenderProvider Interface

 - ์ •์˜ 

   ์†์„ฑ์„ ์ปจํ…Œ์ด๋„ˆ์˜ ๋‹ค๋ฅธ ๊ตฌ์„ฑ ์š”์†Œ๋กœ ํ™•์žฅํ•˜๊ธฐ ์œ„ํ•œ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ •์˜ํ•œ๋‹ค.

 

 - Method

   bool CanExtend(object target)

 

Method์— ๋Œ€ํ•œ ์„ค๋ช…์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๊ธฐ์žฌ๋˜์–ด ์žˆ๋‹ค. 

bool CanExtend(object) ๋ฉ”์„œ๋“œ ํ•˜๋‚˜๋งŒ ์žˆ์œผ๋ฉฐ, ์ด ๋ฉ”์„œ๋“œ๋Š” ์ง€์ •๋œ ๊ฐœ์ฒด์— ๋Œ€ํ•ด ํ™•์žฅ ์†์„ฑ์„ ์ œ๊ณต ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ์ง€์ •ํ•œ๋‹ค. ์ด ๊ฐœ์ฒด๊ฐ€ ์ง€์ •๋œ ๊ฐœ์ฒด์— Extender ์†์„ฑ์„ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์œผ๋ฉด true์ด๊ณ , ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด false์ž…๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์„œ ์ง€์ •๋œ ๊ฐœ์ฒด๋Š” IExtenderProvider ๋ฅผ ์ƒ์†๋ฐ›๋Š” ํด๋ž˜์Šค์— ProvideProperty ๋ผ๋Š” ์• ํŠธ๋ฆฌ๋ทฐํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋Š”๋ฐ ์ด๋•Œ ์ง€์ •๋œ Type์„ ๋งํ•œ๋‹ค.

 

[ProvideProperty("MyLabel", typeof(Control))] // ์ง€์ •๋œ ๊ฐœ์ฒด๋Š” Control
public class LabelExtender : Control, IExtenderProvider
{
   ...
}

CanExtend() ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.

bool IExtenderProvider.CanExtend(object target) 
{
    if (target is Control && !(target is ToolTip)) 
    {
    	return true;
    }
    return false;
}

 

๐Ÿ“– IExtenderProvider Interface ์ƒ์†๋ฐ›์•„ ๊ตฌํ˜„ํ•˜๊ธฐ

IExtenderProvider๋ฅผ ์ƒ์†๋ฐ›์€ ํด๋ž˜์Šค๋Š” ๋ฐ˜๋“œ์‹œ ๋‘๊ฐœ์˜ public ๋ฉ”์„œ๋“œ๋ฅผ ๊ตฌํ˜„ํ•ด์•ผํ•œ๋‹ค.

 

codeproject.com ์‚ฌ์ดํŠธ ๊ธ€ ์ฐธ๊ณ 

https://www.codeproject.com/Articles/4683/Getting-to-know-IExtenderProvider

์†์„ฑ์„ ์ถ”๊ฐ€ํ•˜๋ฉด ๋‘ ๊ฐœ์˜ ๊ณต๊ฐœ ๋ฉ”์„œ๋“œ๋ฅผ ์จ์•ผ ํ•˜๋ฉฐ ์ด๋Ÿฌํ•œ ๋ฉ”์„œ๋“œ๋Š” ์ผ๋ฐ˜ ์†์„ฑ์˜ ๊ฐ€์ ธ์˜ค๊ธฐ/์„ค์ • ๋ถ€๋ถ„์œผ๋กœ ์ž‘๋™ํ•˜๋ฉฐ Get<Name> ๋ฐ Set<Name>์ด๋ผ๋Š” ์ด๋ฆ„์ด ์ง€์ •๋ฉ๋‹ˆ๋‹ค.

Get<Name> ๋ฉ”์„œ๋“œ๋Š” ProviderProperty ์†์„ฑ์ด ์ •์˜ํ•˜๋Š” ์œ ํ˜•์„ ๊ฐ€์ ธ์™€์„œ ์†์„ฑ์˜ ๋ฐ์ดํ„ฐ ์œ ํ˜•์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

Set<Name> ๋ฉ”์„œ๋“œ๋Š” ๋‘ ๊ฐœ์˜ ์ธ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ฒซ ๋ฒˆ์งธ๋Š” Provider Property ์†์„ฑ์— ์ง€์ •๋œ ํ˜•์‹์ด๊ณ , ๋‘ ๋ฒˆ์งธ๋Š” Get<Name> ๋ฐ˜ํ™˜๊ณผ ๋™์ผํ•œ ๋ฐ์ดํ„ฐ ํ˜•์‹์ž…๋‹ˆ๋‹ค. ์ด ๊ฐ’์€ ์‚ฌ์šฉ์ž๊ฐ€ ์†์„ฑ์„ ์„ค์ •ํ•˜๊ณ ์ž ํ•˜๋Š” ๊ฐ’์ž…๋‹ˆ๋‹ค.

Get, Set ๋ฉ”์„œ๋“œ๋ฅผ ์ž‘์„ฑํ•ด์ค˜์•ผํ•˜๋Š”๋ฐ ์—ฌ๊ธฐ์„œ <Name>์„ ์•ž์„œ ์–ธ๊ธ‰ํ•œ ProvideProperty ์• ํŠธ๋ฆฌ๋ทฐํŠธ์˜ ์ฒซ๋ฒˆ์งธ ๋งค๊ฐœ๋ณ€์ˆ˜์ธ proertyName ๊ณผ ๋™์ผํ•˜๊ฒŒ ํ•ด์•ผํ•œ๋‹ค.

 

์•„๋ž˜ ์†Œ์Šค์ฝ”๋“œ ์ฐธ๊ณ 

    [ProvideProperty("MyLabel", typeof(Control))]
    public class LabelExtender : Control, IExtenderProvider
    {
    	//	
        // ...
        //
        
        bool IExtenderProvider.CanExtend(object target)
        {
            if (target is Control && !(target is LabelExtender))
            {
                return true;
            }
            return false;
        }
        
        public string GetMyLabel(Control control)
        {
            string text = (string)hashText[control];
            text = text ?? string.Empty;
            return text;
        }

        public void SetMyLabel(Control control, string value)
        {
            value = value ?? string.Empty;
            if (value.Length == 0)
            {
                hashText.Remove(control);
            }
            else
            {
                hashText[control] = value;
            }
        }
    }

 

 

MSDN์˜ IExtenderProvider Interface ํŽ˜์ด์ง€์— ๋‚˜์™€์žˆ๋Š” ์˜ˆ์ œ์†Œ์Šค๋ฅผ ๊ทธ๋Œ€๋กœ ๊ฐ€์ ธ์™€์„œ ๋™์ž‘ํ•ด๋ด๋„ ํ™•์ธ์ด ๊ฐ€๋Šฅํ•˜์ง€๋งŒ

์›๋ฆฌ๋ฅผ ์ดํ•ดํ•˜๋ฉด์„œ ์ง์ ‘ ๊ตฌํ˜„ํ•ด๋ณด๊ณ  ์‹ถ์–ด์„œ ์—ฌ๋Ÿฌ ์‚ฌ์ดํŠธ๋ฅผ ์ฐธ์กฐํ•ด์„œ ํ™•์žฅ์ปจํŠธ๋กค์„ ๊ตฌํ˜„ํ•ด๋ดค๋‹ค.

 

์ „์ฒด ์†Œ์Šค

using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;

namespace IExtenderProviderDemo
{
    [ProvideProperty("MyLabel", typeof(Control))]
    public class LabelExtender : Control, IExtenderProvider
    {
        private Container components;
        private Hashtable hashText;

        public LabelExtender()
        {
            InitializeComponent();
            hashText = new Hashtable();
        }

        protected override void Dispose(bool disposing)
        {
            if (disposing)
            {
                components.Dispose();
            }
            base.Dispose(disposing);
        }

        private void InitializeComponent()
        {
            this.BackColor = System.Drawing.SystemColors.Info;
            this.components = new Container();
            this.ForeColor = System.Drawing.SystemColors.InfoText;
            this.TabStop = false;
        }

        bool IExtenderProvider.CanExtend(object extendee)
        {
            if (extendee is Control &&
                !(extendee is LabelExtender))
            {
                return true;
            }
            return false;
        }
        
        public string GetMyLabel(Control control)
        {
            string text = (string)hashText[control];
            text = text ?? string.Empty;
            return text;
        }

        public void SetMyLabel(Control control, string value)
        {
            value = value ?? string.Empty;
            if (value.Length == 0)
            {
                hashText.Remove(control);
            }
            else
            {
                hashText[control] = value;
            }
        }
    }
}

 

๋ฐ˜์‘ํ˜•
lee365โ˜•๏ธ