{"id":37805,"date":"2024-11-01T10:00:33","date_gmt":"2024-11-01T10:00:33","guid":{"rendered":"http:\/\/atmokpo.com\/w\/?p=37805"},"modified":"2024-11-01T11:03:39","modified_gmt":"2024-11-01T11:03:39","slug":"wpf-course-creating-custom-controls","status":"publish","type":"post","link":"https:\/\/atmokpo.com\/w\/37805\/","title":{"rendered":"WPF Course, Creating Custom Controls"},"content":{"rendered":"<article>\n<p>Windows Presentation Foundation (WPF) is a technology designed for developing GUI applications on the .NET Framework. WPF provides a variety of built-in controls and layouts that allow users to easily develop applications that deliver outstanding user experiences. However, sometimes the provided basic controls may not meet specific requirements. In this case, custom controls can be created to tailor the application to specific needs.<\/p>\n<h2>1. The Need for Custom Controls<\/h2>\n<p>As business requirements become increasingly diverse and design needs become more detailed, it has become challenging for the provided controls to meet all demands. Custom controls are useful in the following situations:<\/p>\n<ul>\n<li><strong>Personalized UX\/UI:<\/strong> When a UI\/UX tailored to specific business logic is required.<\/li>\n<li><strong>Reusability:<\/strong> When encapsulating common functionalities that can be used across multiple projects.<\/li>\n<li><strong>Complex UI Composition:<\/strong> To simplify the composition of complex user interfaces.<\/li>\n<\/ul>\n<h2>2. Creating Custom Controls<\/h2>\n<h3>2.1 Basic Structure<\/h3>\n<p>To create a custom control, you need to inherit from the <strong>Control<\/strong> class. This process allows for customization and enables the use of all functionalities of the provided controls.<\/p>\n<pre><code>public class MyCustomControl : Control\n{\n    static MyCustomControl()\n    {\n        DefaultStyleKeyProperty.OverrideMetadata(typeof(MyCustomControl), new FrameworkPropertyMetadata(typeof(MyCustomControl)));\n    }\n}<\/code><\/pre>\n<h3>2.2 Defining XAML Styles<\/h3>\n<p>To define the style of a custom control, you must create a <code>Generic.xaml<\/code> file in the Themes folder. This file defines the default styles and templates.<\/p>\n<pre><code>&lt;Style TargetType=\"{x:Type local:MyCustomControl}\"&gt;\n    &lt;Setter Property=\"Template\"&gt;\n        &lt;Setter.Value&gt;\n            &lt;ControlTemplate TargetType=\"{x:Type local:MyCustomControl}\"&gt;\n                &lt;Border Background=\"{TemplateBinding Background}\"&gt;\n                    &lt;ContentPresenter \/&gt;\n                &lt;\/Border&gt;\n            &lt;\/ControlTemplate&gt;\n        &lt;Setter.Value&gt;\n    &lt;\/Setter&gt;\n&lt;\/Style&gt;<\/code><\/pre>\n<h3>2.3 Adding Properties<\/h3>\n<p>Let&#8217;s learn how to add properties to custom controls. By defining a Dependency Property, you enable support for binding and styling.<\/p>\n<pre><code>public static readonly DependencyProperty MyPropertyProperty = DependencyProperty.Register(\n        \"MyProperty\", typeof(string), typeof(MyCustomControl), new FrameworkPropertyMetadata(default(string)));\n        \n    public string MyProperty\n    {\n        get { return (string)GetValue(MyPropertyProperty); }\n        set { SetValue(MyPropertyProperty, value); }\n    }<\/code><\/pre>\n<h3>2.4 Adding Events<\/h3>\n<p>It is also important to handle events in custom controls. By defining custom events, you can allow external control.<\/p>\n<pre><code>public static readonly RoutedEvent MyEvent = EventManager.RegisterRoutedEvent(\n        \"MyEvent\", RoutingStrategy.Bubble, typeof(RoutedEventHandler), typeof(MyCustomControl));\n        \n    public event RoutedEventHandler MyEventHandler\n    {\n        add { AddHandler(MyEvent, value); }\n        remove { RemoveHandler(MyEvent, value); }\n    }<\/code><\/pre>\n<h2>3. Using Custom Controls<\/h2>\n<p>Next, we will explain how to use custom controls in XAML. First, you declare the namespace, and then you can use the control.<\/p>\n<pre><code>&lt;Window x:Class=\"MyNamespace.MainWindow\"\n            xmlns=\"http:\/\/schemas.microsoft.com\/winfx\/2006\/xaml\/presentation\"\n            xmlns:x=\"http:\/\/schemas.microsoft.com\/winfx\/2006\/xaml\"\n            xmlns:local=\"clr-namespace:MyNamespace\"&gt;\n    &lt;local:MyCustomControl MyProperty=\"Hello, World!\" \/&gt;\n    &lt;\/Window&gt;<\/code><\/pre>\n<h3>3.1 Overriding Styles and Templates<\/h3>\n<p>You can override the default styles or modify the template to suit user preferences. This allows for maintaining a consistent design and UI.<\/p>\n<h3>3.2 Data Binding<\/h3>\n<p>Custom controls support data binding. This enables easy binding of custom control properties while maintaining the MVVM architecture.<\/p>\n<h2>4. Advanced Custom Controls<\/h2>\n<p>To develop more complex custom controls, you can combine multiple controls to create a new control. This process can also enhance reusability and maintainability.<\/p>\n<h3>4.1 Combining Multiple Controls on Screen<\/h3>\n<p>You can combine multiple basic controls to create the desired functionality. For example, you could create a custom control that combines a button and a text box.<\/p>\n<h3>4.2 Using Animations and Triggers<\/h3>\n<p>WPF has an animation and trigger system. You can use these within custom controls to provide a richer experience.<\/p>\n<h2>5. Reasons to Create Custom Controls<\/h2>\n<p>Custom controls mean more than just manipulating the UI. Through custom controls, you can:<\/p>\n<ul>\n<li>Organize code more efficiently.<\/li>\n<li>Maximize reusability across multiple projects.<\/li>\n<li>Create UI components that are easy for users to manage.<\/li>\n<\/ul>\n<h2>6. Conclusion<\/h2>\n<p>Through this lesson, we have understood the advantages of creating custom controls in WPF and learned specific implementation methods. We hope you can contribute to developing efficient and useful applications by using custom controls.<\/p>\n<h2>7. References<\/h2>\n<ul>\n<li><a href=\"https:\/\/docs.microsoft.com\/en-us\/dotnet\/desktop\/wpf\/controls\/control-customization-overview?view=netframeworkdesktop-4.8\">Microsoft WPF Control Customization<\/a><\/li>\n<li><a href=\"https:\/\/wpf-commands.blogspot.com\/\">WPF Commands and Controls<\/a><\/li>\n<li><a href=\"https:\/\/www.codeproject.com\/Articles\/1206589\/Creating-Custom-WPF-Controls\">Creating Custom WPF Controls CodeProject<\/a><\/li>\n<\/ul>\n<\/article>\n","protected":false},"excerpt":{"rendered":"<p>Windows Presentation Foundation (WPF) is a technology designed for developing GUI applications on the .NET Framework. WPF provides a variety of built-in controls and layouts that allow users to easily develop applications that deliver outstanding user experiences. However, sometimes the provided basic controls may not meet specific requirements. In this case, custom controls can be &hellip; <a href=\"https:\/\/atmokpo.com\/w\/37805\/\" class=\"more-link\">\ub354 \ubcf4\uae30<span class=\"screen-reader-text\"> &#8220;WPF Course, Creating Custom Controls&#8221;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[117],"tags":[],"class_list":["post-37805","post","type-post","status-publish","format-standard","hentry","category-wpf-programming"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v26.2 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>WPF Course, Creating Custom Controls - \ub77c\uc774\ube0c\uc2a4\ub9c8\ud2b8<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/atmokpo.com\/w\/37805\/\" \/>\n<meta property=\"og:locale\" content=\"ko_KR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"WPF Course, Creating Custom Controls - \ub77c\uc774\ube0c\uc2a4\ub9c8\ud2b8\" \/>\n<meta property=\"og:description\" content=\"Windows Presentation Foundation (WPF) is a technology designed for developing GUI applications on the .NET Framework. WPF provides a variety of built-in controls and layouts that allow users to easily develop applications that deliver outstanding user experiences. However, sometimes the provided basic controls may not meet specific requirements. In this case, custom controls can be &hellip; \ub354 \ubcf4\uae30 &quot;WPF Course, Creating Custom Controls&quot;\" \/>\n<meta property=\"og:url\" content=\"https:\/\/atmokpo.com\/w\/37805\/\" \/>\n<meta property=\"og:site_name\" content=\"\ub77c\uc774\ube0c\uc2a4\ub9c8\ud2b8\" \/>\n<meta property=\"article:published_time\" content=\"2024-11-01T10:00:33+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2024-11-01T11:03:39+00:00\" \/>\n<meta name=\"author\" content=\"root\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@bebubo4\" \/>\n<meta name=\"twitter:site\" content=\"@bebubo4\" \/>\n<meta name=\"twitter:label1\" content=\"\uae00\uc4f4\uc774\" \/>\n\t<meta name=\"twitter:data1\" content=\"root\" \/>\n\t<meta name=\"twitter:label2\" content=\"\uc608\uc0c1 \ub418\ub294 \ud310\ub3c5 \uc2dc\uac04\" \/>\n\t<meta name=\"twitter:data2\" content=\"3\ubd84\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/atmokpo.com\/w\/37805\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/atmokpo.com\/w\/37805\/\"},\"author\":{\"name\":\"root\",\"@id\":\"https:\/\/atmokpo.com\/w\/#\/schema\/person\/91b6b3b138fbba0efb4ae64b1abd81d7\"},\"headline\":\"WPF Course, Creating Custom Controls\",\"datePublished\":\"2024-11-01T10:00:33+00:00\",\"dateModified\":\"2024-11-01T11:03:39+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/atmokpo.com\/w\/37805\/\"},\"wordCount\":491,\"publisher\":{\"@id\":\"https:\/\/atmokpo.com\/w\/#organization\"},\"articleSection\":[\"WPF Programming\"],\"inLanguage\":\"ko-KR\"},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/atmokpo.com\/w\/37805\/\",\"url\":\"https:\/\/atmokpo.com\/w\/37805\/\",\"name\":\"WPF Course, Creating Custom Controls - \ub77c\uc774\ube0c\uc2a4\ub9c8\ud2b8\",\"isPartOf\":{\"@id\":\"https:\/\/atmokpo.com\/w\/#website\"},\"datePublished\":\"2024-11-01T10:00:33+00:00\",\"dateModified\":\"2024-11-01T11:03:39+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/atmokpo.com\/w\/37805\/#breadcrumb\"},\"inLanguage\":\"ko-KR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/atmokpo.com\/w\/37805\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/atmokpo.com\/w\/37805\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"\ud648\",\"item\":\"https:\/\/atmokpo.com\/w\/en\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"WPF Course, Creating Custom Controls\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/atmokpo.com\/w\/#website\",\"url\":\"https:\/\/atmokpo.com\/w\/\",\"name\":\"\ub77c\uc774\ube0c\uc2a4\ub9c8\ud2b8\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\/\/atmokpo.com\/w\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/atmokpo.com\/w\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"ko-KR\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/atmokpo.com\/w\/#organization\",\"name\":\"\ub77c\uc774\ube0c\uc2a4\ub9c8\ud2b8\",\"url\":\"https:\/\/atmokpo.com\/w\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"ko-KR\",\"@id\":\"https:\/\/atmokpo.com\/w\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/atmokpo.com\/w\/wp-content\/uploads\/2024\/11\/logo.png\",\"contentUrl\":\"https:\/\/atmokpo.com\/w\/wp-content\/uploads\/2024\/11\/logo.png\",\"width\":400,\"height\":400,\"caption\":\"\ub77c\uc774\ube0c\uc2a4\ub9c8\ud2b8\"},\"image\":{\"@id\":\"https:\/\/atmokpo.com\/w\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/x.com\/bebubo4\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/atmokpo.com\/w\/#\/schema\/person\/91b6b3b138fbba0efb4ae64b1abd81d7\",\"name\":\"root\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"ko-KR\",\"@id\":\"https:\/\/atmokpo.com\/w\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/708197b41fc6435a7ce22d951b25d4a47e9e904270cb1f04682d4f025066f80c?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/708197b41fc6435a7ce22d951b25d4a47e9e904270cb1f04682d4f025066f80c?s=96&d=mm&r=g\",\"caption\":\"root\"},\"sameAs\":[\"http:\/\/atmokpo.com\/w\"],\"url\":\"https:\/\/atmokpo.com\/w\/author\/root\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"WPF Course, Creating Custom Controls - \ub77c\uc774\ube0c\uc2a4\ub9c8\ud2b8","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/atmokpo.com\/w\/37805\/","og_locale":"ko_KR","og_type":"article","og_title":"WPF Course, Creating Custom Controls - \ub77c\uc774\ube0c\uc2a4\ub9c8\ud2b8","og_description":"Windows Presentation Foundation (WPF) is a technology designed for developing GUI applications on the .NET Framework. WPF provides a variety of built-in controls and layouts that allow users to easily develop applications that deliver outstanding user experiences. However, sometimes the provided basic controls may not meet specific requirements. In this case, custom controls can be &hellip; \ub354 \ubcf4\uae30 \"WPF Course, Creating Custom Controls\"","og_url":"https:\/\/atmokpo.com\/w\/37805\/","og_site_name":"\ub77c\uc774\ube0c\uc2a4\ub9c8\ud2b8","article_published_time":"2024-11-01T10:00:33+00:00","article_modified_time":"2024-11-01T11:03:39+00:00","author":"root","twitter_card":"summary_large_image","twitter_creator":"@bebubo4","twitter_site":"@bebubo4","twitter_misc":{"\uae00\uc4f4\uc774":"root","\uc608\uc0c1 \ub418\ub294 \ud310\ub3c5 \uc2dc\uac04":"3\ubd84"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/atmokpo.com\/w\/37805\/#article","isPartOf":{"@id":"https:\/\/atmokpo.com\/w\/37805\/"},"author":{"name":"root","@id":"https:\/\/atmokpo.com\/w\/#\/schema\/person\/91b6b3b138fbba0efb4ae64b1abd81d7"},"headline":"WPF Course, Creating Custom Controls","datePublished":"2024-11-01T10:00:33+00:00","dateModified":"2024-11-01T11:03:39+00:00","mainEntityOfPage":{"@id":"https:\/\/atmokpo.com\/w\/37805\/"},"wordCount":491,"publisher":{"@id":"https:\/\/atmokpo.com\/w\/#organization"},"articleSection":["WPF Programming"],"inLanguage":"ko-KR"},{"@type":"WebPage","@id":"https:\/\/atmokpo.com\/w\/37805\/","url":"https:\/\/atmokpo.com\/w\/37805\/","name":"WPF Course, Creating Custom Controls - \ub77c\uc774\ube0c\uc2a4\ub9c8\ud2b8","isPartOf":{"@id":"https:\/\/atmokpo.com\/w\/#website"},"datePublished":"2024-11-01T10:00:33+00:00","dateModified":"2024-11-01T11:03:39+00:00","breadcrumb":{"@id":"https:\/\/atmokpo.com\/w\/37805\/#breadcrumb"},"inLanguage":"ko-KR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/atmokpo.com\/w\/37805\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/atmokpo.com\/w\/37805\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"\ud648","item":"https:\/\/atmokpo.com\/w\/en\/"},{"@type":"ListItem","position":2,"name":"WPF Course, Creating Custom Controls"}]},{"@type":"WebSite","@id":"https:\/\/atmokpo.com\/w\/#website","url":"https:\/\/atmokpo.com\/w\/","name":"\ub77c\uc774\ube0c\uc2a4\ub9c8\ud2b8","description":"","publisher":{"@id":"https:\/\/atmokpo.com\/w\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/atmokpo.com\/w\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"ko-KR"},{"@type":"Organization","@id":"https:\/\/atmokpo.com\/w\/#organization","name":"\ub77c\uc774\ube0c\uc2a4\ub9c8\ud2b8","url":"https:\/\/atmokpo.com\/w\/","logo":{"@type":"ImageObject","inLanguage":"ko-KR","@id":"https:\/\/atmokpo.com\/w\/#\/schema\/logo\/image\/","url":"https:\/\/atmokpo.com\/w\/wp-content\/uploads\/2024\/11\/logo.png","contentUrl":"https:\/\/atmokpo.com\/w\/wp-content\/uploads\/2024\/11\/logo.png","width":400,"height":400,"caption":"\ub77c\uc774\ube0c\uc2a4\ub9c8\ud2b8"},"image":{"@id":"https:\/\/atmokpo.com\/w\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/x.com\/bebubo4"]},{"@type":"Person","@id":"https:\/\/atmokpo.com\/w\/#\/schema\/person\/91b6b3b138fbba0efb4ae64b1abd81d7","name":"root","image":{"@type":"ImageObject","inLanguage":"ko-KR","@id":"https:\/\/atmokpo.com\/w\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/708197b41fc6435a7ce22d951b25d4a47e9e904270cb1f04682d4f025066f80c?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/708197b41fc6435a7ce22d951b25d4a47e9e904270cb1f04682d4f025066f80c?s=96&d=mm&r=g","caption":"root"},"sameAs":["http:\/\/atmokpo.com\/w"],"url":"https:\/\/atmokpo.com\/w\/author\/root\/"}]}},"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"jetpack-related-posts":[],"_links":{"self":[{"href":"https:\/\/atmokpo.com\/w\/wp-json\/wp\/v2\/posts\/37805","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/atmokpo.com\/w\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/atmokpo.com\/w\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/atmokpo.com\/w\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/atmokpo.com\/w\/wp-json\/wp\/v2\/comments?post=37805"}],"version-history":[{"count":1,"href":"https:\/\/atmokpo.com\/w\/wp-json\/wp\/v2\/posts\/37805\/revisions"}],"predecessor-version":[{"id":37806,"href":"https:\/\/atmokpo.com\/w\/wp-json\/wp\/v2\/posts\/37805\/revisions\/37806"}],"wp:attachment":[{"href":"https:\/\/atmokpo.com\/w\/wp-json\/wp\/v2\/media?parent=37805"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/atmokpo.com\/w\/wp-json\/wp\/v2\/categories?post=37805"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/atmokpo.com\/w\/wp-json\/wp\/v2\/tags?post=37805"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}