{"id":42931,"date":"2024-11-13T22:28:17","date_gmt":"2024-11-13T22:28:17","guid":{"rendered":"https:\/\/atmokpo.com\/w\/?p=42931"},"modified":"2024-11-26T06:34:17","modified_gmt":"2024-11-26T06:34:17","slug":"mvvm-9-mvvm%ea%b3%bc-wpf-%eb%94%94%ec%9e%90%ec%9d%b8-%ed%8c%a8%ed%84%b4-%eb%b0%8f-ui-%ec%bb%a4%ec%8a%a4%ed%84%b0%eb%a7%88%ec%9d%b4%ec%a7%95-blend-behaviors%ec%99%80-animations%ec%9d%84-%ed%99%9c","status":"publish","type":"post","link":"https:\/\/atmokpo.com\/w\/42931\/","title":{"rendered":"[MVVM] 9.MVVM\uacfc WPF \ub514\uc790\uc778 \ud328\ud134 \ubc0f UI \ucee4\uc2a4\ud130\ub9c8\uc774\uc9d5, Blend Behaviors\uc640 Animations\uc744 \ud65c\uc6a9\ud55c \uc0ac\uc6a9\uc790 \uacbd\ud5d8 \uac1c\uc120"},"content":{"rendered":"<p>\n    WPF(Windows Presentation Foundation)\uc640 MVVM(Model-View-ViewModel) \ub514\uc790\uc778 \ud328\ud134\uc758 \uc870\ud569\uc740 \ud604\ub300\uc801\uc778 \ub370\uc2a4\ud06c\ud0d1 \uc560\ud50c\ub9ac\ucf00\uc774\uc158 \uac1c\ubc1c\uc5d0 \uc788\uc5b4 \ub9e4\uc6b0 \uc911\uc694\ud55c \uc5ed\ud560\uc744 \ud558\uace0 \uc788\uc2b5\ub2c8\ub2e4. \uc774 \uae00\uc5d0\uc11c\ub294 MVVM\uacfc WPF\uc758 \uc6d0\ub9ac\ub97c \uc124\uba85\ud558\uace0, UI \ucee4\uc2a4\ud130\ub9c8\uc774\uc9d5 \ubc0f Blend Behaviors\uc640 Animations\uc744 \ud65c\uc6a9\ud558\uc5ec \uc0ac\uc6a9\uc790 \uacbd\ud5d8\uc744 \uac1c\uc120\ud558\ub294 \ubc29\ubc95\uc744 \uc0c1\uc138\ud788 \ub2e4\ub8f0 \uac83\uc785\ub2c8\ub2e4. \uc774\ub97c \ud1b5\ud574 \ub3c5\uc790\ub4e4\uc740 \ubcf4\ub2e4 \uae54\ub054\ud558\uace0 \uc720\uc9c0\ubcf4\uc218\uac00 \uc6a9\uc774\ud55c \ucf54\ub4dc\ub97c \uc791\uc131\ud558\uace0, \ub9e4\ub825\uc801\uc778 UI\/UX\ub97c \uad6c\ud604\ud560 \uc218 \uc788\ub294 \ubc29\ubc95\uc744 \ubc30\uc6b8 \uc218 \uc788\uc2b5\ub2c8\ub2e4.\n<\/p>\n<h2>1. MVVM \ub514\uc790\uc778 \ud328\ud134 \uc18c\uac1c<\/h2>\n<p>\n    MVVM \ub514\uc790\uc778 \ud328\ud134\uc740 \uc138 \uac00\uc9c0 \uc8fc\uc694 \uad6c\uc131 \uc694\uc18c\uc778 \ubaa8\ub378(Model), \ubdf0(View), \ubdf0\ubaa8\ub378(ViewModel)\ub85c \uad6c\uc131\ub429\ub2c8\ub2e4. \uc774 \ud328\ud134\uc740 UI\uc640 \ube44\uc988\ub2c8\uc2a4 \ub85c\uc9c1\uc774 \ubd84\ub9ac\ub418\ub3c4\ub85d \ub3c4\uc640\uc8fc\uc5b4, \ud14c\uc2a4\ud2b8 \uac00\ub2a5\uc131\uacfc \uc7ac\uc0ac\uc6a9\uc131\uc744 \ub192\uc5ec\uc90d\ub2c8\ub2e4.\n<\/p>\n<h3>1.1 \ubaa8\ub378 (Model)<\/h3>\n<p>\n    \ubaa8\ub378\uc740 \uc751\uc6a9 \ud504\ub85c\uadf8\ub7a8\uc758 \ub370\uc774\ud130\uc640 \ube44\uc988\ub2c8\uc2a4 \ub85c\uc9c1\uc744 \uc815\uc758\ud569\ub2c8\ub2e4. \uc77c\ubc18\uc801\uc73c\ub85c \ub370\uc774\ud130\ubca0\uc774\uc2a4 \ub610\ub294 \uc678\ubd80 API\uc640\uc758 \uc0c1\ud638\uc791\uc6a9\uc744 \ub2f4\ub2f9\ud569\ub2c8\ub2e4.\n<\/p>\n<h3>1.2 \ubdf0 (View)<\/h3>\n<p>\n    \ubdf0\ub294 \uc0ac\uc6a9\uc790\uac00 \uc2e4\uc81c\ub85c \uc0c1\ud638\uc791\uc6a9\ud558\ub294 UI \uc694\uc18c\uc785\ub2c8\ub2e4. XAML \ud30c\uc77c\ub85c \uc815\uc758\ub418\uba70, \ubdf0\ubaa8\ub378\uacfc \ub370\uc774\ud130 \ubc14\uc778\ub529\uc744 \ud1b5\ud574 \ub370\uc774\ud130\uc640 \uc5f0\uacb0\ub429\ub2c8\ub2e4.\n<\/p>\n<h3>1.3 \ubdf0\ubaa8\ub378 (ViewModel)<\/h3>\n<p>\n    \ubdf0\ubaa8\ub378\uc740 \ubaa8\ub378\uacfc \ubdf0 \uac04\uc758 \uc911\uc7ac\uc790 \uc5ed\ud560\uc744 \ud569\ub2c8\ub2e4. \uc0ac\uc6a9\uc790 \uc785\ub825\uc744 \ucc98\ub9ac\ud558\uace0, \uad00\ub828\ub41c \ubaa8\ub378 \ub370\uc774\ud130\ub97c \uac00\uc838\uc640\uc11c \ubdf0\uc640 \ub3d9\uae30\ud654\ud569\ub2c8\ub2e4.\n<\/p>\n<h2>2. WPF\uc758 UI \ucee4\uc2a4\ud130\ub9c8\uc774\uc9d5 \uae30\ubc95<\/h2>\n<p>\n    WPF\ub294 UI\uc758 \ub192\uc740 \ucee4\uc2a4\ud130\ub9c8\uc774\uc9d5 \uac00\ub2a5\uc131\uc744 \uc81c\uacf5\ud569\ub2c8\ub2e4. XAML \uc5b8\uc5b4\ub97c \uc0ac\uc6a9\ud558\uc5ec \ubcf5\uc7a1\ud55c UI\ub97c \uc27d\uac8c \uad6c\ucd95\ud560 \uc218 \uc788\uc73c\uba70, \ub2e4\uc591\ud55c \uc2a4\ud0c0\uc77c\uacfc \ud15c\ud50c\ub9bf\uc744 \ud1b5\ud574 UI\ub97c \ubbf8\uc801\uc73c\ub85c \uac1c\uc120\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.\n<\/p>\n<h3>2.1 Styles\uc640 Control Templates<\/h3>\n<p>\n    WPF\uc5d0\uc11c\ub294 Styles\uc640 Control Templates\ub97c \uc0ac\uc6a9\ud558\uc5ec UI \ucee8\ud2b8\ub864\uc758 \uc2a4\ud0c0\uc77c\uc744 \ubcc0\uacbd\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uc2a4\ud0c0\uc77c\uc740 \ucee8\ud2b8\ub864\uc758 \uc18d\uc131\uac12\uc744 \uc7ac\uc815\uc758\ud558\uace0, Control Template\uc740 \ucee8\ud2b8\ub864\uc758 \uad6c\uc870\ub97c \uc7ac\uc815\uc758\ud569\ub2c8\ub2e4.\n<\/p>\n<pre><code class=\"language-xml\">\n<!-- \uc2a4\ud0c0\uc77c \uc608\uc81c -->\n<style targettype=\"Button\">\n    <Setter Property=\"Background\" Value=\"LightBlue\"\/>\n    <Setter Property=\"Foreground\" Value=\"White\"\/>\n    <Setter Property=\"FontSize\" Value=\"16\"\/>\n<\/style>\n\n<!-- \ucee8\ud2b8\ub864 \ud15c\ud50c\ub9bf \uc608\uc81c -->\n<controltemplate targettype=\"Button\">\n    <border background=\"{TemplateBinding Background}\" cornerradius=\"5\">\n        <contentpresenter horizontalalignment=\"Center\" verticalalignment=\"Center\"><\/contentpresenter>\n    <\/border>\n<\/controltemplate>\n<\/code><\/pre>\n<h3>2.2 DataTemplates<\/h3>\n<p>\n    DataTemplates\ub97c \uc0ac\uc6a9\ud558\uba74 \ub370\uc774\ud130\ub97c \uc5b4\ub5bb\uac8c \ud45c\uc2dc\ud560\uc9c0\ub97c \uc815\uc758\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uc774 \ubc29\ubc95\uc740 MVVM \ud328\ud134\uacfc \ud568\uaed8 \uc0ac\uc6a9\ud560 \ub54c \ud070 \uc7a5\uc810\uc744 \uc81c\uacf5\ud569\ub2c8\ub2e4.\n<\/p>\n<pre><code class=\"language-xml\">\n<datatemplate datatype=\"{x:Type local:Person}\">\n    <stackpanel>\n        <textblock fontsize=\"20\" text=\"{Binding Name}\"><\/textblock>\n        <textblock fontsize=\"16\" text=\"{Binding Age}\"><\/textblock>\n    <\/stackpanel>\n<\/datatemplate>\n<\/code><\/pre>\n<h2>3. Blend Behaviors\uc640 Animations<\/h2>\n<p>\n    Blend Behaviors\uc640 Animations\uc740 WPF \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc758 \uc0ac\uc6a9\uc790 \uacbd\ud5d8\uc744 \uac1c\uc120\ud558\ub294 \ub370 \uc911\uc694\ud55c \uc5ed\ud560\uc744 \ud569\ub2c8\ub2e4. WPF\uc758 \ub370\uc774\ud130 \ubc14\uc778\ub529, \uc2a4\ud0c0\uc77c\ub9c1, \ud15c\ud50c\ub9bf \uae30\ub2a5\uc744 \ud1b5\ud574 \uc27d\uac8c \uc560\ub2c8\uba54\uc774\uc158\uacfc \uc778\ud130\ub799\uc158\uc744 \ucd94\uac00\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.\n<\/p>\n<h3>3.1 Blend Behaviors<\/h3>\n<p>\n    Blend Behaviors\ub294 \uc0ac\uc6a9\uc790\uc640 \uc0c1\ud638\uc791\uc6a9\ud558\ub294 \uc560\ub2c8\uba54\uc774\uc158 \ud6a8\uacfc\ub97c \uc27d\uac8c \ucd94\uac00\ud560 \uc218 \uc788\ub294 \ubc29\ubc95\uc744 \uc81c\uacf5\ud569\ub2c8\ub2e4. \uc774\ub97c \ud1b5\ud574 UI \uc694\uc18c\uac00 \ud2b9\uc815 \uc774\ubca4\ud2b8\uc5d0 \ubc18\uc751\ud558\ub3c4\ub85d \uc124\uc815\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.\n<\/p>\n<pre><code class=\"language-xml\">\n<button content=\"Click Me!\">\n    <interactivity:interaction.triggers>\n        <interactivity:eventtrigger eventname=\"Click\">\n            <interactivity:invokecommandaction command=\"{Binding YourCommand}\"><\/interactivity:invokecommandaction>\n        <\/interactivity:eventtrigger>\n    <\/interactivity:interaction.triggers>\n<\/button>\n<\/code><\/pre>\n<h4>3.2 \uc560\ub2c8\uba54\uc774\uc158<\/h4>\n<p>\n    WPF\uc5d0\uc11c \uc560\ub2c8\uba54\uc774\uc158\uc744 \uc27d\uac8c \uc801\uc6a9\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. Storyboard\ub97c \uc0ac\uc6a9\ud558\uc5ec UI \uc694\uc18c\uc758 \uc18d\uc131\uc744 \uc560\ub2c8\uba54\uc774\uc158\ud654\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.\n<\/p>\n<pre><code class=\"language-xml\">\n<storyboard>\n    <doubleanimation duration=\"0:0:1\" from=\"1\" storyboard.targetname=\"MyButton\" storyboard.targetproperty=\"Opacity\" to=\"0\"><\/doubleanimation>\n<\/storyboard>\n<\/code><\/pre>\n<h2>4. MVVM\uacfc \uacb0\ud569\ub41c UI \ucee4\uc2a4\ud130\ub9c8\uc774\uc9d5 \uc608\uc81c<\/h2>\n<p>\n    \uc774\uc81c MVVM \ud328\ud134\uacfc WPF\uc758 UI \ucee4\uc2a4\ud130\ub9c8\uc774\uc9d5 \uae30\ubc95\uc744 \uacb0\ud569\ud558\uc5ec \uc2e4\uc81c \uc560\ud50c\ub9ac\ucf00\uc774\uc158 \uc608\uc81c\ub97c \ub9cc\ub4e4\uc5b4 \ubcf4\uaca0\uc2b5\ub2c8\ub2e4. \uc6b0\ub9ac\ub294 \uac04\ub2e8\ud55c \uc9c1\uc6d0 \ub4f1\ub85d \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc744 \uad6c\ucd95\ud560 \uac83\uc785\ub2c8\ub2e4.\n<\/p>\n<h3>4.1 \ubaa8\ub378 \ud074\ub798\uc2a4<\/h3>\n<pre><code class=\"language-csharp\">\npublic class Employee\n{\n    public string Name { get; set; }\n    public int Age { get; set; }\n}\n<\/code><\/pre>\n<h3>4.2 \ubdf0\ubaa8\ub378 \ud074\ub798\uc2a4<\/h3>\n<pre><code class=\"language-csharp\">\npublic class EmployeeViewModel : INotifyPropertyChanged\n{\n    private ObservableCollection<employee> employees;\n    public ObservableCollection<employee> Employees\n    {\n        get { return employees; }\n        set\n        {\n            employees = value;\n            OnPropertyChanged(nameof(Employees));\n        }\n    }\n\n    public ICommand AddEmployeeCommand { get; }\n\n    public EmployeeViewModel()\n    {\n        Employees = new ObservableCollection<employee>();\n        AddEmployeeCommand = new RelayCommand(AddEmployee);\n    }\n\n    private void AddEmployee()\n    {\n        Employees.Add(new Employee() { Name = \"John Doe\", Age = 30 });\n    }\n\n    public event PropertyChangedEventHandler PropertyChanged;\n    protected void OnPropertyChanged(string propertyName)\n    {\n        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));\n    }\n}\n<\/employee><\/employee><\/employee><\/code><\/pre>\n<h3>4.3 \ubdf0 (XAML)<\/h3>\n<pre><code class=\"language-xml\">\n<window height=\"350\" title=\"Employee Registration\" width=\"525\" x:class=\"EmployeeApp.MainWindow\" xmlns=\"http:\/\/schemas.microsoft.com\/winfx\/2006\/xaml\/presentation\" xmlns:local=\"clr-namespace:EmployeeApp\" xmlns:x=\"http:\/\/schemas.microsoft.com\/winfx\/2006\/xaml\">\n    <window.datacontext>\n        <local:employeeviewmodel><\/local:employeeviewmodel>\n    <\/window.datacontext>\n\n    <grid>\n        <stackpanel>\n            <button command=\"{Binding AddEmployeeCommand}\" content=\"Add Employee\"><\/button>\n            <listbox itemssource=\"{Binding Employees}\">\n                <listbox.itemtemplate>\n                    <datatemplate>\n                        <stackpanel>\n                            <textblock text=\"{Binding Name}\"><\/textblock>\n                            <textblock text=\"{Binding Age}\"><\/textblock>\n                        <\/stackpanel>\n                    <\/datatemplate>\n                <\/listbox.itemtemplate>\n            <\/listbox>\n        <\/stackpanel>\n        \n        <!-- UI \ucee4\uc2a4\ud130\ub9c8\uc774\uc9d5 -->\n        <grid.resources>\n            <style targettype=\"Button\">\n                <Setter Property=\"Background\" Value=\"Gray\"\/>\n                <Setter Property=\"Foreground\" Value=\"White\"\/>\n            <\/style>\n        <\/grid.resources>\n    <\/grid>\n<\/window>\n<\/code><\/pre>\n<h2>\uacb0\ub860<\/h2>\n<p>\n    MVVM \ub514\uc790\uc778 \ud328\ud134\uacfc WPF\uc758 UI \ucee4\uc2a4\ud130\ub9c8\uc774\uc9d5 \uae30\ubc95\uc744 \ud1b5\ud574, \uac1c\ubc1c\uc790\ub294 \ub354\uc6b1 \ud6a8\uc728\uc801\uc774\uace0 \uc0ac\uc6a9\uc790 \uce5c\ud654\uc801\uc778 \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc744 \uad6c\ucd95\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. Blend Behaviors\uc640 Animations\uc744 \uc804\ub7b5\uc801\uc73c\ub85c \ud65c\uc6a9\ud558\uba74 \uc0ac\uc6a9\uc790 \uacbd\ud5d8\uc744 \ud68d\uae30\uc801\uc73c\ub85c \uac1c\uc120\ud560 \uc218 \uc788\uc73c\uba70, \uc774\ub294 \uc804\uccb4\uc801\uc778 \uc0ac\uc6a9\uc790 \ub9cc\uc871\ub3c4\ub85c \uc774\uc5b4\uc9d1\ub2c8\ub2e4. \uacb0\ub860\uc801\uc73c\ub85c, MVVM\uacfc WPF\ub294 \uac15\ub825\ud55c \uc870\ud569\uc774\uba70, \uc774\ub97c \uc801\uc808\ud788 \ud65c\uc6a9\ud574\uc57c \uc131\uacf5\uc801\uc778 \uc560\ud50c\ub9ac\ucf00\uc774\uc158 \uac1c\ubc1c\uc774 \uac00\ub2a5\ud569\ub2c8\ub2e4.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>WPF(Windows Presentation Foundation)\uc640 MVVM(Model-View-ViewModel) \ub514\uc790\uc778 \ud328\ud134\uc758 \uc870\ud569\uc740 \ud604\ub300\uc801\uc778 \ub370\uc2a4\ud06c\ud0d1 \uc560\ud50c\ub9ac\ucf00\uc774\uc158 \uac1c\ubc1c\uc5d0 \uc788\uc5b4 \ub9e4\uc6b0 \uc911\uc694\ud55c \uc5ed\ud560\uc744 \ud558\uace0 \uc788\uc2b5\ub2c8\ub2e4. \uc774 \uae00\uc5d0\uc11c\ub294 MVVM\uacfc WPF\uc758 \uc6d0\ub9ac\ub97c \uc124\uba85\ud558\uace0, UI \ucee4\uc2a4\ud130\ub9c8\uc774\uc9d5 \ubc0f Blend Behaviors\uc640 Animations\uc744 \ud65c\uc6a9\ud558\uc5ec \uc0ac\uc6a9\uc790 \uacbd\ud5d8\uc744 \uac1c\uc120\ud558\ub294 \ubc29\ubc95\uc744 \uc0c1\uc138\ud788 \ub2e4\ub8f0 \uac83\uc785\ub2c8\ub2e4. \uc774\ub97c \ud1b5\ud574 \ub3c5\uc790\ub4e4\uc740 \ubcf4\ub2e4 \uae54\ub054\ud558\uace0 \uc720\uc9c0\ubcf4\uc218\uac00 \uc6a9\uc774\ud55c \ucf54\ub4dc\ub97c \uc791\uc131\ud558\uace0, \ub9e4\ub825\uc801\uc778 UI\/UX\ub97c \uad6c\ud604\ud560 \uc218 \uc788\ub294 \ubc29\ubc95\uc744 \ubc30\uc6b8 \uc218 \uc788\uc2b5\ub2c8\ub2e4. &hellip; <a href=\"https:\/\/atmokpo.com\/w\/42931\/\" class=\"more-link\">\ub354 \ubcf4\uae30<span class=\"screen-reader-text\"> &#8220;[MVVM] 9.MVVM\uacfc WPF \ub514\uc790\uc778 \ud328\ud134 \ubc0f UI \ucee4\uc2a4\ud130\ub9c8\uc774\uc9d5, Blend Behaviors\uc640 Animations\uc744 \ud65c\uc6a9\ud55c \uc0ac\uc6a9\uc790 \uacbd\ud5d8 \uac1c\uc120&#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":[39],"tags":[],"class_list":["post-42931","post","type-post","status-publish","format-standard","hentry","category-wpf-"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v26.2 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>[MVVM] 9.MVVM\uacfc WPF \ub514\uc790\uc778 \ud328\ud134 \ubc0f UI \ucee4\uc2a4\ud130\ub9c8\uc774\uc9d5, Blend Behaviors\uc640 Animations\uc744 \ud65c\uc6a9\ud55c \uc0ac\uc6a9\uc790 \uacbd\ud5d8 \uac1c\uc120 - \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\/42931\/\" \/>\n<meta property=\"og:locale\" content=\"ko_KR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"[MVVM] 9.MVVM\uacfc WPF \ub514\uc790\uc778 \ud328\ud134 \ubc0f UI \ucee4\uc2a4\ud130\ub9c8\uc774\uc9d5, Blend Behaviors\uc640 Animations\uc744 \ud65c\uc6a9\ud55c \uc0ac\uc6a9\uc790 \uacbd\ud5d8 \uac1c\uc120 - \ub77c\uc774\ube0c\uc2a4\ub9c8\ud2b8\" \/>\n<meta property=\"og:description\" content=\"WPF(Windows Presentation Foundation)\uc640 MVVM(Model-View-ViewModel) \ub514\uc790\uc778 \ud328\ud134\uc758 \uc870\ud569\uc740 \ud604\ub300\uc801\uc778 \ub370\uc2a4\ud06c\ud0d1 \uc560\ud50c\ub9ac\ucf00\uc774\uc158 \uac1c\ubc1c\uc5d0 \uc788\uc5b4 \ub9e4\uc6b0 \uc911\uc694\ud55c \uc5ed\ud560\uc744 \ud558\uace0 \uc788\uc2b5\ub2c8\ub2e4. \uc774 \uae00\uc5d0\uc11c\ub294 MVVM\uacfc WPF\uc758 \uc6d0\ub9ac\ub97c \uc124\uba85\ud558\uace0, UI \ucee4\uc2a4\ud130\ub9c8\uc774\uc9d5 \ubc0f Blend Behaviors\uc640 Animations\uc744 \ud65c\uc6a9\ud558\uc5ec \uc0ac\uc6a9\uc790 \uacbd\ud5d8\uc744 \uac1c\uc120\ud558\ub294 \ubc29\ubc95\uc744 \uc0c1\uc138\ud788 \ub2e4\ub8f0 \uac83\uc785\ub2c8\ub2e4. \uc774\ub97c \ud1b5\ud574 \ub3c5\uc790\ub4e4\uc740 \ubcf4\ub2e4 \uae54\ub054\ud558\uace0 \uc720\uc9c0\ubcf4\uc218\uac00 \uc6a9\uc774\ud55c \ucf54\ub4dc\ub97c \uc791\uc131\ud558\uace0, \ub9e4\ub825\uc801\uc778 UI\/UX\ub97c \uad6c\ud604\ud560 \uc218 \uc788\ub294 \ubc29\ubc95\uc744 \ubc30\uc6b8 \uc218 \uc788\uc2b5\ub2c8\ub2e4. &hellip; \ub354 \ubcf4\uae30 &quot;[MVVM] 9.MVVM\uacfc WPF \ub514\uc790\uc778 \ud328\ud134 \ubc0f UI \ucee4\uc2a4\ud130\ub9c8\uc774\uc9d5, Blend Behaviors\uc640 Animations\uc744 \ud65c\uc6a9\ud55c \uc0ac\uc6a9\uc790 \uacbd\ud5d8 \uac1c\uc120&quot;\" \/>\n<meta property=\"og:url\" content=\"https:\/\/atmokpo.com\/w\/42931\/\" \/>\n<meta property=\"og:site_name\" content=\"\ub77c\uc774\ube0c\uc2a4\ub9c8\ud2b8\" \/>\n<meta property=\"article:published_time\" content=\"2024-11-13T22:28:17+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2024-11-26T06:34:17+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=\"1\ubd84\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/atmokpo.com\/w\/42931\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/atmokpo.com\/w\/42931\/\"},\"author\":{\"name\":\"root\",\"@id\":\"https:\/\/atmokpo.com\/w\/#\/schema\/person\/91b6b3b138fbba0efb4ae64b1abd81d7\"},\"headline\":\"[MVVM] 9.MVVM\uacfc WPF \ub514\uc790\uc778 \ud328\ud134 \ubc0f UI \ucee4\uc2a4\ud130\ub9c8\uc774\uc9d5, Blend Behaviors\uc640 Animations\uc744 \ud65c\uc6a9\ud55c \uc0ac\uc6a9\uc790 \uacbd\ud5d8 \uac1c\uc120\",\"datePublished\":\"2024-11-13T22:28:17+00:00\",\"dateModified\":\"2024-11-26T06:34:17+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/atmokpo.com\/w\/42931\/\"},\"wordCount\":83,\"publisher\":{\"@id\":\"https:\/\/atmokpo.com\/w\/#organization\"},\"articleSection\":[\"WPF \uac1c\ubc1c\"],\"inLanguage\":\"ko-KR\"},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/atmokpo.com\/w\/42931\/\",\"url\":\"https:\/\/atmokpo.com\/w\/42931\/\",\"name\":\"[MVVM] 9.MVVM\uacfc WPF \ub514\uc790\uc778 \ud328\ud134 \ubc0f UI \ucee4\uc2a4\ud130\ub9c8\uc774\uc9d5, Blend Behaviors\uc640 Animations\uc744 \ud65c\uc6a9\ud55c \uc0ac\uc6a9\uc790 \uacbd\ud5d8 \uac1c\uc120 - \ub77c\uc774\ube0c\uc2a4\ub9c8\ud2b8\",\"isPartOf\":{\"@id\":\"https:\/\/atmokpo.com\/w\/#website\"},\"datePublished\":\"2024-11-13T22:28:17+00:00\",\"dateModified\":\"2024-11-26T06:34:17+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/atmokpo.com\/w\/42931\/#breadcrumb\"},\"inLanguage\":\"ko-KR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/atmokpo.com\/w\/42931\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/atmokpo.com\/w\/42931\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"\ud648\",\"item\":\"https:\/\/atmokpo.com\/w\/en\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"[MVVM] 9.MVVM\uacfc WPF \ub514\uc790\uc778 \ud328\ud134 \ubc0f UI \ucee4\uc2a4\ud130\ub9c8\uc774\uc9d5, Blend Behaviors\uc640 Animations\uc744 \ud65c\uc6a9\ud55c \uc0ac\uc6a9\uc790 \uacbd\ud5d8 \uac1c\uc120\"}]},{\"@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":"[MVVM] 9.MVVM\uacfc WPF \ub514\uc790\uc778 \ud328\ud134 \ubc0f UI \ucee4\uc2a4\ud130\ub9c8\uc774\uc9d5, Blend Behaviors\uc640 Animations\uc744 \ud65c\uc6a9\ud55c \uc0ac\uc6a9\uc790 \uacbd\ud5d8 \uac1c\uc120 - \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\/42931\/","og_locale":"ko_KR","og_type":"article","og_title":"[MVVM] 9.MVVM\uacfc WPF \ub514\uc790\uc778 \ud328\ud134 \ubc0f UI \ucee4\uc2a4\ud130\ub9c8\uc774\uc9d5, Blend Behaviors\uc640 Animations\uc744 \ud65c\uc6a9\ud55c \uc0ac\uc6a9\uc790 \uacbd\ud5d8 \uac1c\uc120 - \ub77c\uc774\ube0c\uc2a4\ub9c8\ud2b8","og_description":"WPF(Windows Presentation Foundation)\uc640 MVVM(Model-View-ViewModel) \ub514\uc790\uc778 \ud328\ud134\uc758 \uc870\ud569\uc740 \ud604\ub300\uc801\uc778 \ub370\uc2a4\ud06c\ud0d1 \uc560\ud50c\ub9ac\ucf00\uc774\uc158 \uac1c\ubc1c\uc5d0 \uc788\uc5b4 \ub9e4\uc6b0 \uc911\uc694\ud55c \uc5ed\ud560\uc744 \ud558\uace0 \uc788\uc2b5\ub2c8\ub2e4. \uc774 \uae00\uc5d0\uc11c\ub294 MVVM\uacfc WPF\uc758 \uc6d0\ub9ac\ub97c \uc124\uba85\ud558\uace0, UI \ucee4\uc2a4\ud130\ub9c8\uc774\uc9d5 \ubc0f Blend Behaviors\uc640 Animations\uc744 \ud65c\uc6a9\ud558\uc5ec \uc0ac\uc6a9\uc790 \uacbd\ud5d8\uc744 \uac1c\uc120\ud558\ub294 \ubc29\ubc95\uc744 \uc0c1\uc138\ud788 \ub2e4\ub8f0 \uac83\uc785\ub2c8\ub2e4. \uc774\ub97c \ud1b5\ud574 \ub3c5\uc790\ub4e4\uc740 \ubcf4\ub2e4 \uae54\ub054\ud558\uace0 \uc720\uc9c0\ubcf4\uc218\uac00 \uc6a9\uc774\ud55c \ucf54\ub4dc\ub97c \uc791\uc131\ud558\uace0, \ub9e4\ub825\uc801\uc778 UI\/UX\ub97c \uad6c\ud604\ud560 \uc218 \uc788\ub294 \ubc29\ubc95\uc744 \ubc30\uc6b8 \uc218 \uc788\uc2b5\ub2c8\ub2e4. &hellip; \ub354 \ubcf4\uae30 \"[MVVM] 9.MVVM\uacfc WPF \ub514\uc790\uc778 \ud328\ud134 \ubc0f UI \ucee4\uc2a4\ud130\ub9c8\uc774\uc9d5, Blend Behaviors\uc640 Animations\uc744 \ud65c\uc6a9\ud55c \uc0ac\uc6a9\uc790 \uacbd\ud5d8 \uac1c\uc120\"","og_url":"https:\/\/atmokpo.com\/w\/42931\/","og_site_name":"\ub77c\uc774\ube0c\uc2a4\ub9c8\ud2b8","article_published_time":"2024-11-13T22:28:17+00:00","article_modified_time":"2024-11-26T06:34:17+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":"1\ubd84"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/atmokpo.com\/w\/42931\/#article","isPartOf":{"@id":"https:\/\/atmokpo.com\/w\/42931\/"},"author":{"name":"root","@id":"https:\/\/atmokpo.com\/w\/#\/schema\/person\/91b6b3b138fbba0efb4ae64b1abd81d7"},"headline":"[MVVM] 9.MVVM\uacfc WPF \ub514\uc790\uc778 \ud328\ud134 \ubc0f UI \ucee4\uc2a4\ud130\ub9c8\uc774\uc9d5, Blend Behaviors\uc640 Animations\uc744 \ud65c\uc6a9\ud55c \uc0ac\uc6a9\uc790 \uacbd\ud5d8 \uac1c\uc120","datePublished":"2024-11-13T22:28:17+00:00","dateModified":"2024-11-26T06:34:17+00:00","mainEntityOfPage":{"@id":"https:\/\/atmokpo.com\/w\/42931\/"},"wordCount":83,"publisher":{"@id":"https:\/\/atmokpo.com\/w\/#organization"},"articleSection":["WPF \uac1c\ubc1c"],"inLanguage":"ko-KR"},{"@type":"WebPage","@id":"https:\/\/atmokpo.com\/w\/42931\/","url":"https:\/\/atmokpo.com\/w\/42931\/","name":"[MVVM] 9.MVVM\uacfc WPF \ub514\uc790\uc778 \ud328\ud134 \ubc0f UI \ucee4\uc2a4\ud130\ub9c8\uc774\uc9d5, Blend Behaviors\uc640 Animations\uc744 \ud65c\uc6a9\ud55c \uc0ac\uc6a9\uc790 \uacbd\ud5d8 \uac1c\uc120 - \ub77c\uc774\ube0c\uc2a4\ub9c8\ud2b8","isPartOf":{"@id":"https:\/\/atmokpo.com\/w\/#website"},"datePublished":"2024-11-13T22:28:17+00:00","dateModified":"2024-11-26T06:34:17+00:00","breadcrumb":{"@id":"https:\/\/atmokpo.com\/w\/42931\/#breadcrumb"},"inLanguage":"ko-KR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/atmokpo.com\/w\/42931\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/atmokpo.com\/w\/42931\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"\ud648","item":"https:\/\/atmokpo.com\/w\/en\/"},{"@type":"ListItem","position":2,"name":"[MVVM] 9.MVVM\uacfc WPF \ub514\uc790\uc778 \ud328\ud134 \ubc0f UI \ucee4\uc2a4\ud130\ub9c8\uc774\uc9d5, Blend Behaviors\uc640 Animations\uc744 \ud65c\uc6a9\ud55c \uc0ac\uc6a9\uc790 \uacbd\ud5d8 \uac1c\uc120"}]},{"@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\/42931","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=42931"}],"version-history":[{"count":1,"href":"https:\/\/atmokpo.com\/w\/wp-json\/wp\/v2\/posts\/42931\/revisions"}],"predecessor-version":[{"id":42932,"href":"https:\/\/atmokpo.com\/w\/wp-json\/wp\/v2\/posts\/42931\/revisions\/42932"}],"wp:attachment":[{"href":"https:\/\/atmokpo.com\/w\/wp-json\/wp\/v2\/media?parent=42931"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/atmokpo.com\/w\/wp-json\/wp\/v2\/categories?post=42931"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/atmokpo.com\/w\/wp-json\/wp\/v2\/tags?post=42931"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}