<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="3.10.0">Jekyll</generator><link href="https://jay1127.github.io/feed.xml" rel="self" type="application/atom+xml" /><link href="https://jay1127.github.io/" rel="alternate" type="text/html" /><updated>2025-01-09T06:40:38+00:00</updated><id>https://jay1127.github.io/feed.xml</id><title type="html">LC’s 개발 블로그</title><subtitle>PROGRAMMING BLOG</subtitle><author><name> </name><email>oksujay1127@google.com</email></author><entry><title type="html">WPF : 35. ScrollViewer내 DataGrid의 스크롤이 안되는 경우 해결방법</title><link href="https://jay1127.github.io/wpf/1-How-To-Scroll-DataGrid-In-ScrollViewer/" rel="alternate" type="text/html" title="WPF : 35. ScrollViewer내 DataGrid의 스크롤이 안되는 경우 해결방법" /><published>2025-01-08T00:00:00+00:00</published><updated>2025-01-08T00:00:00+00:00</updated><id>https://jay1127.github.io/wpf/1-How-To-Scroll-DataGrid-In-ScrollViewer</id><content type="html" xml:base="https://jay1127.github.io/wpf/1-How-To-Scroll-DataGrid-In-ScrollViewer/"><![CDATA[<p><code class="language-plaintext highlighter-rouge">ScrollViewer</code>내 <code class="language-plaintext highlighter-rouge">DataGrid</code>를 생성한 경우, <code class="language-plaintext highlighter-rouge">DataGrid</code>를 마우스 휠을 이용해서 스크롤이 안되는 문제가 발생한다.  <code class="language-plaintext highlighter-rouge">PreviewMouseWheel</code> 이벤트를 다음과 같이 구현해서 문제를 해결할 수 있다.</p>

<div class="language-xml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nt">&lt;ScrollViewer</span> <span class="na">Height=</span><span class="s">"350"</span><span class="nt">&gt;</span>
    <span class="nt">&lt;Grid&gt;</span>
        <span class="nt">&lt;DataGrid</span> <span class="na">ItemsSource=</span><span class="s">"{Binding Items}"</span>
                  <span class="na">PreviewMouseWheel=</span><span class="s">"DataGrid_MouseWheel"</span><span class="nt">/&gt;</span>
    <span class="nt">&lt;/Grid&gt;</span>
<span class="nt">&lt;/ScrollViewer&gt;</span>
</code></pre></div></div>

<p><br /></p>

<div class="language-csharp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">private</span> <span class="k">void</span> <span class="nf">DataGrid_MouseWheel</span><span class="p">(</span><span class="kt">object</span> <span class="n">sender</span><span class="p">,</span> <span class="n">MouseWheelEventArgs</span> <span class="n">e</span><span class="p">)</span>
<span class="p">{</span>
    <span class="kt">var</span> <span class="n">dataGrid</span> <span class="p">=</span> <span class="n">sender</span> <span class="k">as</span> <span class="n">DataGrid</span><span class="p">;</span>
    <span class="kt">var</span> <span class="n">scrollViewer</span> <span class="p">=</span> <span class="p">(</span><span class="n">dataGrid</span><span class="p">.</span><span class="n">Parent</span> <span class="k">as</span> <span class="n">Grid</span><span class="p">).</span><span class="n">Parent</span> <span class="k">as</span> <span class="n">ScrollViewer</span><span class="p">;</span>

    <span class="kt">var</span> <span class="n">args</span> <span class="p">=</span> <span class="k">new</span> <span class="nf">MouseWheelEventArgs</span><span class="p">(</span><span class="n">e</span><span class="p">.</span><span class="n">MouseDevice</span><span class="p">,</span> <span class="n">e</span><span class="p">.</span><span class="n">Timestamp</span><span class="p">,</span> <span class="n">e</span><span class="p">.</span><span class="n">Delta</span><span class="p">);</span>
    <span class="n">args</span><span class="p">.</span><span class="n">RoutedEvent</span> <span class="p">=</span> <span class="n">ScrollViewer</span><span class="p">.</span><span class="n">MouseWheelEvent</span><span class="p">;</span>
    <span class="n">scrollViewer</span><span class="p">.</span><span class="nf">RaiseEvent</span><span class="p">(</span><span class="n">args</span><span class="p">);</span>
<span class="p">}</span>
</code></pre></div></div>]]></content><author><name> </name><email>oksujay1127@google.com</email></author><category term="WPF" /><summary type="html"><![CDATA[ScrollViewer, DataGrid, WPF DataGrid Scroll in ScrollViewer]]></summary></entry><entry><title type="html">WPF : 36. 엑셀에서 DataGrid에 셀 붙여넣기</title><link href="https://jay1127.github.io/wpf/2-How-To-Paste-Excel-To-DataGrid/" rel="alternate" type="text/html" title="WPF : 36. 엑셀에서 DataGrid에 셀 붙여넣기" /><published>2025-01-08T00:00:00+00:00</published><updated>2025-01-08T00:00:00+00:00</updated><id>https://jay1127.github.io/wpf/2-How-To-Paste-Excel-To-DataGrid</id><content type="html" xml:base="https://jay1127.github.io/wpf/2-How-To-Paste-Excel-To-DataGrid/"><![CDATA[<p><code class="language-plaintext highlighter-rouge">DataGrid</code>는 붙여넣기가 기본적으로 지원되지 않기 때문에 다음과 같이 해결할 수 있다.</p>

<ul>
  <li>클립보드에서 붙여넣을 데이터를 분류</li>
  <li>바인딩된 열(column)에 해당하는 속성(property)정보를 가져와 업데이트</li>
</ul>

<p><br /></p>

<div class="language-csharp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">public</span> <span class="k">class</span> <span class="nc">DataGridPasteBehavior</span> <span class="p">:</span> <span class="n">Behavior</span><span class="p">&lt;</span><span class="n">DataGrid</span><span class="p">&gt;</span>
<span class="p">{</span>
    <span class="k">protected</span> <span class="k">override</span> <span class="k">void</span> <span class="nf">OnAttached</span><span class="p">()</span>
    <span class="p">{</span>
        <span class="k">base</span><span class="p">.</span><span class="nf">OnAttached</span><span class="p">();</span>

        <span class="n">CommandBinding</span> <span class="n">PasteCommandBinding</span> <span class="p">=</span> <span class="k">new</span> <span class="nf">CommandBinding</span><span class="p">(</span>
            <span class="n">ApplicationCommands</span><span class="p">.</span><span class="n">Paste</span><span class="p">,</span>
            <span class="n">PasteCommandExecuted</span><span class="p">,</span>
            <span class="n">PasteCommandCanExecute</span><span class="p">);</span>
        <span class="n">AssociatedObject</span><span class="p">.</span><span class="n">CommandBindings</span><span class="p">.</span><span class="nf">Add</span><span class="p">(</span><span class="n">PasteCommandBinding</span><span class="p">);</span>
    <span class="p">}</span>

    <span class="k">protected</span> <span class="k">override</span> <span class="k">void</span> <span class="nf">OnDetaching</span><span class="p">()</span>
    <span class="p">{</span>
        <span class="k">base</span><span class="p">.</span><span class="nf">OnDetaching</span><span class="p">();</span>
    <span class="p">}</span>

    <span class="k">private</span> <span class="k">void</span> <span class="nf">PasteCommandExecuted</span><span class="p">(</span><span class="kt">object</span> <span class="n">target</span><span class="p">,</span> <span class="n">ExecutedRoutedEventArgs</span> <span class="n">e</span><span class="p">)</span>
    <span class="p">{</span>
        <span class="k">try</span>
        <span class="p">{</span>
            <span class="kt">var</span> <span class="n">dataGrid</span> <span class="p">=</span> <span class="n">target</span> <span class="k">as</span> <span class="n">DataGrid</span><span class="p">;</span>

            <span class="kt">var</span> <span class="n">rowDatas</span> <span class="p">=</span> <span class="n">Clipboard</span><span class="p">.</span><span class="nf">GetText</span><span class="p">().</span><span class="nf">Split</span><span class="p">(</span><span class="k">new</span><span class="p">[]</span> <span class="p">{</span> <span class="s">"\r\n"</span><span class="p">,</span> <span class="s">"\n"</span> <span class="p">},</span> <span class="n">StringSplitOptions</span><span class="p">.</span><span class="n">RemoveEmptyEntries</span><span class="p">);</span>
            <span class="kt">int</span> <span class="n">selectedRowIndex</span> <span class="p">=</span> <span class="n">dataGrid</span><span class="p">.</span><span class="n">Items</span><span class="p">.</span><span class="nf">IndexOf</span><span class="p">(</span><span class="n">dataGrid</span><span class="p">.</span><span class="n">CurrentItem</span><span class="p">);</span>
            <span class="kt">int</span> <span class="n">selectedColIndex</span> <span class="p">=</span> <span class="n">dataGrid</span><span class="p">.</span><span class="n">Columns</span><span class="p">.</span><span class="nf">IndexOf</span><span class="p">(</span><span class="n">dataGrid</span><span class="p">.</span><span class="n">CurrentColumn</span><span class="p">);</span>

            <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="p">=</span> <span class="m">0</span><span class="p">;</span> <span class="n">i</span> <span class="p">&lt;</span> <span class="n">rowDatas</span><span class="p">.</span><span class="n">Length</span><span class="p">;</span> <span class="n">i</span><span class="p">++)</span>
            <span class="p">{</span>
                <span class="kt">string</span><span class="p">[]</span> <span class="n">columns</span> <span class="p">=</span> <span class="n">rowDatas</span><span class="p">[</span><span class="n">i</span><span class="p">].</span><span class="nf">Split</span><span class="p">(</span><span class="sc">'\t'</span><span class="p">);</span>

                <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">j</span> <span class="p">=</span> <span class="m">0</span><span class="p">;</span> <span class="n">j</span> <span class="p">&lt;</span> <span class="n">columns</span><span class="p">.</span><span class="n">Length</span><span class="p">;</span> <span class="n">j</span><span class="p">++)</span>
                <span class="p">{</span>
                    <span class="kt">var</span> <span class="n">cell</span> <span class="p">=</span> <span class="n">columns</span><span class="p">[</span><span class="n">j</span><span class="p">];</span>
                    <span class="kt">var</span> <span class="n">rowData</span> <span class="p">=</span> <span class="n">dataGrid</span><span class="p">.</span><span class="n">Items</span><span class="p">[</span><span class="n">selectedRowIndex</span> <span class="p">+</span> <span class="n">i</span><span class="p">];</span>
                    <span class="kt">var</span> <span class="n">column</span> <span class="p">=</span> <span class="n">dataGrid</span><span class="p">.</span><span class="n">Columns</span><span class="p">[</span><span class="n">selectedColIndex</span> <span class="p">+</span> <span class="n">j</span><span class="p">];</span>

                    <span class="k">if</span> <span class="p">(</span><span class="n">column</span> <span class="k">is</span> <span class="n">DataGridTextColumn</span> <span class="n">textColumn</span><span class="p">)</span>
                    <span class="p">{</span>
                        <span class="kt">var</span> <span class="n">binding</span> <span class="p">=</span> <span class="n">textColumn</span><span class="p">.</span><span class="n">Binding</span> <span class="k">as</span> <span class="n">System</span><span class="p">.</span><span class="n">Windows</span><span class="p">.</span><span class="n">Data</span><span class="p">.</span><span class="n">Binding</span><span class="p">;</span>
                        <span class="kt">var</span> <span class="n">propertyName</span> <span class="p">=</span> <span class="n">binding</span><span class="p">?.</span><span class="n">Path</span><span class="p">.</span><span class="n">Path</span><span class="p">;</span>

                        <span class="k">if</span> <span class="p">(!</span><span class="kt">string</span><span class="p">.</span><span class="nf">IsNullOrEmpty</span><span class="p">(</span><span class="n">propertyName</span><span class="p">))</span>
                        <span class="p">{</span>
                            <span class="kt">var</span> <span class="n">propertyInfo</span> <span class="p">=</span> <span class="n">rowData</span><span class="p">.</span><span class="nf">GetType</span><span class="p">().</span><span class="nf">GetProperty</span><span class="p">(</span><span class="n">propertyName</span><span class="p">);</span>
                            <span class="kt">var</span> <span class="n">convertedValue</span> <span class="p">=</span> <span class="n">Convert</span><span class="p">.</span><span class="nf">ChangeType</span><span class="p">(</span><span class="n">cell</span><span class="p">,</span> <span class="n">propertyInfo</span><span class="p">.</span><span class="n">PropertyType</span><span class="p">);</span>
                            <span class="n">propertyInfo</span><span class="p">.</span><span class="nf">SetValue</span><span class="p">(</span><span class="n">rowData</span><span class="p">,</span> <span class="n">convertedValue</span><span class="p">,</span> <span class="k">null</span><span class="p">);</span>
                        <span class="p">}</span>
                    <span class="p">}</span>
                <span class="p">}</span>
            <span class="p">}</span>
        <span class="p">}</span>
        <span class="k">catch</span> <span class="p">(</span><span class="n">Exception</span> <span class="n">ex</span><span class="p">)</span>
        <span class="p">{</span>
        <span class="p">}</span>
    <span class="p">}</span>

    <span class="k">private</span> <span class="k">void</span> <span class="nf">PasteCommandCanExecute</span><span class="p">(</span><span class="kt">object</span> <span class="n">target</span><span class="p">,</span> <span class="n">CanExecuteRoutedEventArgs</span> <span class="n">e</span><span class="p">)</span>
    <span class="p">{</span>
        <span class="kt">var</span> <span class="n">dataGrid</span> <span class="p">=</span> <span class="n">target</span> <span class="k">as</span> <span class="n">DataGrid</span><span class="p">;</span>
        <span class="n">e</span><span class="p">.</span><span class="n">CanExecute</span> <span class="p">=</span> <span class="n">dataGrid</span><span class="p">.</span><span class="n">CurrentCell</span> <span class="p">!=</span> <span class="k">null</span><span class="p">;</span>
        <span class="n">e</span><span class="p">.</span><span class="n">Handled</span> <span class="p">=</span> <span class="k">true</span><span class="p">;</span>
    <span class="p">}</span>
<span class="p">}</span>
</code></pre></div></div>]]></content><author><name> </name><email>oksujay1127@google.com</email></author><category term="WPF" /><summary type="html"><![CDATA[Paste excel to datagrid in wpf]]></summary></entry><entry><title type="html">WPF : 37. 공통 스타일 윈도우(팝업) 만드는 법</title><link href="https://jay1127.github.io/wpf/3-How-To-Make-Common-Style-Popup/" rel="alternate" type="text/html" title="WPF : 37. 공통 스타일 윈도우(팝업) 만드는 법" /><published>2025-01-08T00:00:00+00:00</published><updated>2025-01-08T00:00:00+00:00</updated><id>https://jay1127.github.io/wpf/3-How-To-Make-Common-Style-Popup</id><content type="html" xml:base="https://jay1127.github.io/wpf/3-How-To-Make-Common-Style-Popup/"><![CDATA[<div class="language-csharp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">[</span><span class="nf">TemplatePart</span><span class="p">(</span><span class="n">Name</span> <span class="p">=</span> <span class="s">"PART_CloseButton"</span><span class="p">,</span> <span class="n">Type</span> <span class="p">=</span> <span class="k">typeof</span><span class="p">(</span><span class="n">Button</span><span class="p">))]</span>
<span class="k">public</span> <span class="k">class</span> <span class="nc">DialogShell</span> <span class="p">:</span> <span class="n">Window</span>
<span class="p">{</span>
    <span class="k">static</span> <span class="nf">DialogShell</span><span class="p">()</span>
    <span class="p">{</span>
        <span class="n">DefaultStyleKeyProperty</span><span class="p">.</span><span class="nf">OverrideMetadata</span><span class="p">(</span><span class="k">typeof</span><span class="p">(</span><span class="n">DialogShell</span><span class="p">),</span> <span class="k">new</span> <span class="nf">FrameworkPropertyMetadata</span><span class="p">(</span><span class="k">typeof</span><span class="p">(</span><span class="n">DialogShell</span><span class="p">)));</span>
    <span class="p">}</span>

    <span class="k">public</span> <span class="nf">DialogShell</span><span class="p">()</span>
    <span class="p">{</span>
    <span class="p">}</span>

    <span class="k">public</span> <span class="k">override</span> <span class="k">void</span> <span class="nf">OnApplyTemplate</span><span class="p">()</span>
    <span class="p">{</span>
        <span class="k">base</span><span class="p">.</span><span class="nf">OnApplyTemplate</span><span class="p">();</span>

        <span class="kt">var</span> <span class="n">closeButton</span> <span class="p">=</span> <span class="nf">GetTemplateChild</span><span class="p">(</span><span class="s">"PART_CloseButton"</span><span class="p">)</span> <span class="k">as</span> <span class="n">Button</span><span class="p">;</span>
        <span class="n">closeButton</span><span class="p">.</span><span class="n">Click</span> <span class="p">+=</span> <span class="p">(</span><span class="n">s</span><span class="p">,</span> <span class="n">e</span><span class="p">)</span> <span class="p">=&gt;</span> <span class="nf">Close</span><span class="p">();</span>
    <span class="p">}</span>
<span class="p">}</span>
</code></pre></div></div>

<p><br /></p>

<div class="language-xml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nt">&lt;Style</span> <span class="na">TargetType=</span><span class="s">"{x:Type local:DialogShell}"</span>
       <span class="na">x:Key=</span><span class="s">""</span><span class="nt">&gt;</span>
    <span class="nt">&lt;Setter</span> <span class="na">Property=</span><span class="s">"WindowStyle"</span>
            <span class="na">Value=</span><span class="s">"None"</span> <span class="nt">/&gt;</span>
    <span class="nt">&lt;Setter</span> <span class="na">Property=</span><span class="s">"ResizeMode"</span>
            <span class="na">Value=</span><span class="s">"NoResize"</span> <span class="nt">/&gt;</span>
    <span class="nt">&lt;Setter</span> <span class="na">Property=</span><span class="s">"WindowChrome.WindowChrome"</span><span class="nt">&gt;</span>
        <span class="nt">&lt;Setter.Value&gt;</span>
            <span class="nt">&lt;WindowChrome</span> <span class="na">CaptionHeight=</span><span class="s">"50"</span> <span class="nt">/&gt;</span>
        <span class="nt">&lt;/Setter.Value&gt;</span>
    <span class="nt">&lt;/Setter&gt;</span>
    <span class="nt">&lt;Setter</span> <span class="na">Property=</span><span class="s">"Template"</span><span class="nt">&gt;</span>            
        <span class="nt">&lt;Setter.Value&gt;</span>
            <span class="nt">&lt;ControlTemplate</span> <span class="na">TargetType=</span><span class="s">"{x:Type local:DialogShell}"</span><span class="nt">&gt;</span>
                <span class="nt">&lt;AdornerDecorator&gt;</span>
                    <span class="nt">&lt;Border</span> <span class="na">BorderBrush=</span><span class="s">"Black"</span>
                            <span class="na">BorderThickness=</span><span class="s">"1"</span>
                            <span class="na">Background=</span><span class="s">"White"</span><span class="nt">&gt;</span>
                        <span class="nt">&lt;Grid&gt;</span>
                            <span class="nt">&lt;Grid.RowDefinitions&gt;</span>
                                <span class="nt">&lt;RowDefinition</span> <span class="na">Height=</span><span class="s">"50"</span> <span class="nt">/&gt;</span>
                                <span class="nt">&lt;RowDefinition</span> <span class="nt">/&gt;</span>
                            <span class="nt">&lt;/Grid.RowDefinitions&gt;</span>

                            <span class="nt">&lt;Grid&gt;</span>
                                <span class="nt">&lt;Border</span> <span class="na">Background=</span><span class="s">"Brown"</span> <span class="nt">/&gt;</span>
                                <span class="nt">&lt;TextBlock</span> <span class="na">Text=</span><span class="s">"{TemplateBinding Title}"</span><span class="nt">/&gt;</span>
                                <span class="nt">&lt;Button</span> <span class="na">x:Name=</span><span class="s">"PART_CloseButton"</span>
                                        <span class="na">Content=</span><span class="s">"x"</span>
                                        <span class="na">Width=</span><span class="s">"30"</span>
                                        <span class="na">Height=</span><span class="s">"30"</span>
                                        <span class="na">HorizontalAlignment=</span><span class="s">"Right"</span>
                                        <span class="na">Margin=</span><span class="s">"0,0,10,0"</span> <span class="nt">/&gt;</span>
                            <span class="nt">&lt;/Grid&gt;</span>

                            <span class="nt">&lt;ContentPresenter</span> <span class="na">Grid.Row=</span><span class="s">"1"</span> <span class="nt">/&gt;</span>
                        <span class="nt">&lt;/Grid&gt;</span>
                    <span class="nt">&lt;/Border&gt;</span>
                <span class="nt">&lt;/AdornerDecorator&gt;</span>
            <span class="nt">&lt;/ControlTemplate&gt;</span>
        <span class="nt">&lt;/Setter.Value&gt;</span>
    <span class="nt">&lt;/Setter&gt;</span>
<span class="nt">&lt;/Style&gt;</span>
</code></pre></div></div>]]></content><author><name> </name><email>oksujay1127@google.com</email></author><category term="WPF" /><summary type="html"><![CDATA[Make common style window popup in wpf]]></summary></entry><entry><title type="html">WPF : 34. 컨트롤을 썸네일과 같이 드래그 드랍하는 법</title><link href="https://jay1127.github.io/wpf/Drag-Drop-WPF-Control-With-Thumbnail/" rel="alternate" type="text/html" title="WPF : 34. 컨트롤을 썸네일과 같이 드래그 드랍하는 법" /><published>2024-07-22T00:00:00+00:00</published><updated>2024-07-22T00:00:00+00:00</updated><id>https://jay1127.github.io/wpf/Drag-Drop-WPF-Control-With-Thumbnail</id><content type="html" xml:base="https://jay1127.github.io/wpf/Drag-Drop-WPF-Control-With-Thumbnail/"><![CDATA[<p>컨트롤을 썸네일과 같이 드래그 드랍을 하는 방법은 다음과 같다.</p>

<ul>
  <li>드래그 시작할 때, 컨트롤의 이미지 만들기</li>
  <li>컨트롤의 이미지를 <code class="language-plaintext highlighter-rouge">Adorner</code>를 이용해서 이동하기</li>
</ul>

<h3 id="adorner-구현">Adorner 구현</h3>

<div class="language-csharp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">public</span> <span class="k">class</span> <span class="nc">DraggableAdorner</span> <span class="p">:</span> <span class="n">Adorner</span>
<span class="p">{</span>
    <span class="k">private</span> <span class="n">Rect</span> <span class="n">renderSize</span><span class="p">;</span>
    <span class="k">private</span> <span class="n">Point</span> <span class="n">offset</span><span class="p">;</span>
    <span class="k">private</span> <span class="n">ImageSource</span> <span class="n">imageSource</span><span class="p">;</span>

    <span class="k">public</span> <span class="nf">DraggableAdorner</span><span class="p">(</span><span class="n">FrameworkElement</span> <span class="n">adornedElement</span><span class="p">)</span> <span class="p">:</span> <span class="k">base</span><span class="p">(</span><span class="n">adornedElement</span><span class="p">)</span>
    <span class="p">{</span>
        <span class="n">IsHitTestVisible</span> <span class="p">=</span> <span class="k">false</span><span class="p">;</span>
        <span class="n">Opacity</span> <span class="p">=</span> <span class="m">0.7</span><span class="p">;</span>
        
        <span class="n">renderSize</span> <span class="p">=</span> <span class="k">new</span> <span class="nf">Rect</span><span class="p">(</span><span class="n">adornedElement</span><span class="p">.</span><span class="n">RenderSize</span><span class="p">);</span>
        <span class="n">offset</span> <span class="p">=</span> <span class="k">new</span> <span class="nf">Point</span><span class="p">(-</span><span class="n">renderSize</span><span class="p">.</span><span class="n">Width</span> <span class="p">/</span> <span class="m">2</span><span class="p">,</span> <span class="p">-</span><span class="n">renderSize</span><span class="p">.</span><span class="n">Height</span> <span class="p">/</span> <span class="m">2</span><span class="p">);</span>
        <span class="n">imageSource</span> <span class="p">=</span> <span class="nf">GetImgSource</span><span class="p">(</span><span class="n">adornedElement</span><span class="p">);</span>
    <span class="p">}</span>

    <span class="k">public</span> <span class="k">void</span> <span class="nf">SetArrange</span><span class="p">(</span><span class="n">Visual</span> <span class="n">visual</span><span class="p">)</span>
    <span class="p">{</span>
        <span class="n">System</span><span class="p">.</span><span class="n">Drawing</span><span class="p">.</span><span class="n">Point</span> <span class="n">cursorPoint</span> <span class="p">=</span> <span class="n">System</span><span class="p">.</span><span class="n">Windows</span><span class="p">.</span><span class="n">Forms</span><span class="p">.</span><span class="n">Cursor</span><span class="p">.</span><span class="n">Position</span><span class="p">;</span>
        <span class="n">Point</span> <span class="n">point</span> <span class="p">=</span> <span class="n">visual</span><span class="p">.</span><span class="nf">PointFromScreen</span><span class="p">(</span><span class="k">new</span> <span class="nf">Point</span><span class="p">(</span><span class="n">cursorPoint</span><span class="p">.</span><span class="n">X</span> <span class="p">+</span> <span class="n">offset</span><span class="p">.</span><span class="n">X</span><span class="p">,</span> <span class="n">cursorPoint</span><span class="p">.</span><span class="n">Y</span> <span class="p">+</span> <span class="n">offset</span><span class="p">.</span><span class="n">Y</span><span class="p">));</span>
        <span class="nf">Arrange</span><span class="p">(</span><span class="k">new</span> <span class="nf">Rect</span><span class="p">(</span><span class="n">point</span><span class="p">,</span> <span class="n">DesiredSize</span><span class="p">));</span>
    <span class="p">}</span>

    <span class="k">protected</span> <span class="k">override</span> <span class="k">void</span> <span class="nf">OnRender</span><span class="p">(</span><span class="n">DrawingContext</span> <span class="n">drawingContext</span><span class="p">)</span>
    <span class="p">{</span>
        <span class="n">drawingContext</span><span class="p">.</span><span class="nf">DrawImage</span><span class="p">(</span><span class="n">imageSource</span><span class="p">,</span> <span class="n">renderSize</span><span class="p">);</span>
    <span class="p">}</span>

    <span class="k">private</span> <span class="n">ImageSource</span> <span class="nf">GetImgSource</span><span class="p">(</span><span class="n">FrameworkElement</span> <span class="n">element</span><span class="p">)</span>
    <span class="p">{</span>
        <span class="kt">double</span> <span class="n">dpi</span> <span class="p">=</span> <span class="m">96</span><span class="p">;</span>
        <span class="kt">double</span> <span class="n">width</span> <span class="p">=</span> <span class="n">element</span><span class="p">.</span><span class="n">ActualWidth</span><span class="p">;</span>
        <span class="kt">double</span> <span class="n">height</span> <span class="p">=</span> <span class="n">element</span><span class="p">.</span><span class="n">ActualHeight</span><span class="p">;</span>

        <span class="n">DrawingVisual</span> <span class="n">drawingVisual</span> <span class="p">=</span> <span class="k">new</span> <span class="nf">DrawingVisual</span><span class="p">();</span>
        <span class="k">using</span> <span class="p">(</span><span class="n">DrawingContext</span> <span class="n">dc</span> <span class="p">=</span> <span class="n">drawingVisual</span><span class="p">.</span><span class="nf">RenderOpen</span><span class="p">())</span>
        <span class="p">{</span>
            <span class="n">VisualBrush</span> <span class="n">vb</span> <span class="p">=</span> <span class="k">new</span> <span class="nf">VisualBrush</span><span class="p">(</span><span class="n">element</span><span class="p">);</span>
            <span class="n">dc</span><span class="p">.</span><span class="nf">DrawRectangle</span><span class="p">(</span><span class="n">vb</span><span class="p">,</span> <span class="k">null</span><span class="p">,</span> <span class="k">new</span> <span class="nf">Rect</span><span class="p">(</span><span class="k">new</span> <span class="n">System</span><span class="p">.</span><span class="n">Windows</span><span class="p">.</span><span class="nf">Point</span><span class="p">(),</span> <span class="k">new</span> <span class="n">System</span><span class="p">.</span><span class="n">Windows</span><span class="p">.</span><span class="nf">Size</span><span class="p">(</span><span class="n">width</span><span class="p">,</span> <span class="n">height</span><span class="p">)));</span>
        <span class="p">}</span>

        <span class="n">RenderTargetBitmap</span> <span class="n">rtb</span> <span class="p">=</span> <span class="k">new</span> <span class="nf">RenderTargetBitmap</span><span class="p">((</span><span class="kt">int</span><span class="p">)</span><span class="n">Math</span><span class="p">.</span><span class="nf">Round</span><span class="p">(</span><span class="n">width</span><span class="p">),</span> <span class="p">(</span><span class="kt">int</span><span class="p">)</span><span class="n">Math</span><span class="p">.</span><span class="nf">Round</span><span class="p">(</span><span class="n">height</span><span class="p">),</span> <span class="n">dpi</span><span class="p">,</span> <span class="n">dpi</span><span class="p">,</span> <span class="n">PixelFormats</span><span class="p">.</span><span class="n">Default</span><span class="p">);</span>
        <span class="n">rtb</span><span class="p">.</span><span class="nf">Render</span><span class="p">(</span><span class="n">drawingVisual</span><span class="p">);</span>

        <span class="k">return</span> <span class="n">rtb</span><span class="p">;</span>
    <span class="p">}</span>
<span class="p">}</span>
</code></pre></div></div>

<h3 id="드래그-드랍-구현dragdrop">드래그 드랍 구현(DragDrop)</h3>

<div class="language-csharp highlighter-rouge"><div class="highlight"><pre class="highlight"><code>  <span class="k">public</span> <span class="k">partial</span> <span class="k">class</span> <span class="nc">MainWindow</span> <span class="p">:</span> <span class="n">Window</span>
  <span class="p">{</span>
      <span class="k">private</span> <span class="n">DraggableAdorner</span> <span class="n">draggableAdorner</span><span class="p">;</span>

      <span class="k">public</span> <span class="nf">MainWindow</span><span class="p">()</span>
      <span class="p">{</span>
          <span class="nf">InitializeComponent</span><span class="p">();</span>
      <span class="p">}</span>

      <span class="k">private</span> <span class="k">void</span> <span class="nf">SourceLabel_MouseMove</span><span class="p">(</span><span class="kt">object</span> <span class="n">sender</span><span class="p">,</span> <span class="n">MouseEventArgs</span> <span class="n">e</span><span class="p">)</span>
      <span class="p">{</span>
          <span class="kt">var</span> <span class="n">label</span> <span class="p">=</span> <span class="n">sender</span> <span class="k">as</span> <span class="n">Label</span><span class="p">;</span>

          <span class="k">if</span> <span class="p">(</span><span class="n">label</span> <span class="k">is</span> <span class="n">not</span> <span class="k">null</span> <span class="p">&amp;&amp;</span> <span class="n">e</span><span class="p">.</span><span class="n">LeftButton</span> <span class="p">==</span> <span class="n">MouseButtonState</span><span class="p">.</span><span class="n">Pressed</span><span class="p">)</span>
          <span class="p">{</span>
              <span class="n">AdornerLayer</span> <span class="n">adornerLayer</span> <span class="p">=</span> <span class="n">AdornerLayer</span><span class="p">.</span><span class="nf">GetAdornerLayer</span><span class="p">(</span><span class="n">label</span><span class="p">);</span>
              <span class="n">draggableAdorner</span> <span class="p">=</span> <span class="k">new</span> <span class="nf">DraggableAdorner</span><span class="p">(</span><span class="n">label</span><span class="p">);</span>
              <span class="n">adornerLayer</span><span class="p">.</span><span class="nf">Add</span><span class="p">(</span><span class="n">draggableAdorner</span><span class="p">);</span>

              <span class="kt">var</span> <span class="n">dataObject</span> <span class="p">=</span> <span class="k">new</span> <span class="nf">DataObject</span><span class="p">();</span>
              <span class="n">dataObject</span><span class="p">.</span><span class="nf">SetData</span><span class="p">(</span><span class="k">typeof</span><span class="p">(</span><span class="kt">string</span><span class="p">),</span> <span class="n">label</span><span class="p">.</span><span class="n">Content</span><span class="p">.</span><span class="nf">ToString</span><span class="p">());</span>
              <span class="n">DragDrop</span><span class="p">.</span><span class="nf">DoDragDrop</span><span class="p">(</span><span class="n">label</span><span class="p">,</span> <span class="n">dataObject</span><span class="p">,</span> <span class="n">DragDropEffects</span><span class="p">.</span><span class="n">Copy</span><span class="p">);</span>

              <span class="n">adornerLayer</span><span class="p">.</span><span class="nf">Remove</span><span class="p">(</span><span class="n">draggableAdorner</span><span class="p">);</span>
          <span class="p">}</span>
      <span class="p">}</span>

      <span class="k">private</span> <span class="k">void</span> <span class="nf">SourceLabel_PreviewGiveFeedback</span><span class="p">(</span><span class="kt">object</span> <span class="n">sender</span><span class="p">,</span> <span class="n">GiveFeedbackEventArgs</span> <span class="n">e</span><span class="p">)</span>
      <span class="p">{</span>
          <span class="kt">var</span> <span class="n">label</span> <span class="p">=</span> <span class="n">sender</span> <span class="k">as</span> <span class="n">Label</span><span class="p">;</span>

          <span class="k">if</span> <span class="p">(</span><span class="n">label</span> <span class="k">is</span> <span class="n">not</span> <span class="k">null</span><span class="p">)</span>
          <span class="p">{</span>
              <span class="n">draggableAdorner</span><span class="p">.</span><span class="nf">SetArrange</span><span class="p">(</span><span class="n">label</span><span class="p">);</span>
          <span class="p">}</span>
      <span class="p">}</span>

      <span class="k">private</span> <span class="k">void</span> <span class="nf">TargetLabel_Drop</span><span class="p">(</span><span class="kt">object</span> <span class="n">sender</span><span class="p">,</span> <span class="n">DragEventArgs</span> <span class="n">e</span><span class="p">)</span>
      <span class="p">{</span>
          <span class="kt">var</span> <span class="n">label</span> <span class="p">=</span> <span class="n">sender</span> <span class="k">as</span> <span class="n">Label</span><span class="p">;</span>
          <span class="k">if</span> <span class="p">(</span><span class="n">label</span> <span class="k">is</span> <span class="n">not</span> <span class="k">null</span><span class="p">)</span>
          <span class="p">{</span>
              <span class="kt">var</span> <span class="n">srcString</span> <span class="p">=</span> <span class="n">e</span><span class="p">.</span><span class="n">Data</span><span class="p">.</span><span class="nf">GetData</span><span class="p">(</span><span class="k">typeof</span><span class="p">(</span><span class="kt">string</span><span class="p">)).</span><span class="nf">ToString</span><span class="p">();</span>
              <span class="n">label</span><span class="p">.</span><span class="n">Content</span> <span class="p">=</span> <span class="n">srcString</span><span class="p">;</span>
          <span class="p">}</span>
      <span class="p">}</span>
  <span class="p">}</span>
</code></pre></div></div>

<div class="language-xml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nt">&lt;Grid</span> <span class="na">Margin=</span><span class="s">"30"</span><span class="nt">&gt;</span>
    <span class="nt">&lt;Grid.Resources&gt;</span>
        <span class="nt">&lt;Style</span> <span class="na">TargetType=</span><span class="s">"{x:Type Label}"</span><span class="nt">&gt;</span>
            <span class="nt">&lt;Setter</span> <span class="na">Property=</span><span class="s">"Background"</span>
                    <span class="na">Value=</span><span class="s">"LightCyan"</span> <span class="nt">/&gt;</span>
            <span class="nt">&lt;Setter</span> <span class="na">Property=</span><span class="s">"Foreground"</span>
                    <span class="na">Value=</span><span class="s">"Green"</span> <span class="nt">/&gt;</span>
            <span class="nt">&lt;Setter</span> <span class="na">Property=</span><span class="s">"BorderBrush"</span>
                    <span class="na">Value=</span><span class="s">"Blue"</span> <span class="nt">/&gt;</span>
            <span class="nt">&lt;Setter</span> <span class="na">Property=</span><span class="s">"BorderThickness"</span>
                    <span class="na">Value=</span><span class="s">"1"</span> <span class="nt">/&gt;</span>
            <span class="nt">&lt;Setter</span> <span class="na">Property=</span><span class="s">"FontWeight"</span>
                    <span class="na">Value=</span><span class="s">"Bold"</span> <span class="nt">/&gt;</span>
            <span class="nt">&lt;Setter</span> <span class="na">Property=</span><span class="s">"Padding"</span>
                    <span class="na">Value=</span><span class="s">"20"</span> <span class="nt">/&gt;</span>
            <span class="nt">&lt;Setter</span> <span class="na">Property=</span><span class="s">"HorizontalAlignment"</span>
                    <span class="na">Value=</span><span class="s">"Left"</span> <span class="nt">/&gt;</span>
            <span class="nt">&lt;Setter</span> <span class="na">Property=</span><span class="s">"VerticalAlignment"</span>
                    <span class="na">Value=</span><span class="s">"Top"</span> <span class="nt">/&gt;</span>
        <span class="nt">&lt;/Style&gt;</span>
    <span class="nt">&lt;/Grid.Resources&gt;</span>

    <span class="nt">&lt;StackPanel&gt;</span>
        <span class="nt">&lt;Label</span> <span class="na">Content=</span><span class="s">"Drag1"</span>
               <span class="na">MouseMove=</span><span class="s">"SourceLabel_MouseMove"</span>
               <span class="na">PreviewGiveFeedback=</span><span class="s">"SourceLabel_PreviewGiveFeedback"</span> <span class="nt">/&gt;</span>
        <span class="nt">&lt;Label</span> <span class="na">Content=</span><span class="s">"Drag2"</span>
               <span class="na">Margin=</span><span class="s">"0,30,0,0"</span>
               <span class="na">MouseMove=</span><span class="s">"SourceLabel_MouseMove"</span>
               <span class="na">PreviewGiveFeedback=</span><span class="s">"SourceLabel_PreviewGiveFeedback"</span> <span class="nt">/&gt;</span>
    <span class="nt">&lt;/StackPanel&gt;</span>

    <span class="nt">&lt;Label</span> <span class="na">Content=</span><span class="s">"Drag Target"</span>
           <span class="na">Drop=</span><span class="s">"TargetLabel_Drop"</span>
           <span class="na">AllowDrop=</span><span class="s">"True"</span>
           <span class="na">Margin=</span><span class="s">"100,0,0,0"</span> <span class="nt">/&gt;</span>

<span class="nt">&lt;/Grid&gt;</span>
</code></pre></div></div>

<p><img src="https://github.com/user-attachments/assets/b20fc0a4-cf2c-43e6-8a44-da9c82521882" alt="녹화_2024_07_18_11_37_06_929" class="align-center" /></p>]]></content><author><name> </name><email>oksujay1127@google.com</email></author><category term="WPF" /><summary type="html"><![CDATA[Drag Drop WPF Control With Thumbnail, WPF Drag Drop Effect, WPF Drag Drop Adorner]]></summary></entry><entry><title type="html">WPF : 33. 컨트롤을 이미지 파일로 저장하는 법</title><link href="https://jay1127.github.io/wpf/Capture-WPF-Control-To-Image/" rel="alternate" type="text/html" title="WPF : 33. 컨트롤을 이미지 파일로 저장하는 법" /><published>2024-07-19T00:00:00+00:00</published><updated>2024-07-19T00:00:00+00:00</updated><id>https://jay1127.github.io/wpf/Capture-WPF-Control-To-Image</id><content type="html" xml:base="https://jay1127.github.io/wpf/Capture-WPF-Control-To-Image/"><![CDATA[<div class="language-csharp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">public</span> <span class="k">void</span> <span class="nf">Capture</span><span class="p">(</span><span class="n">FrameworkElement</span> <span class="n">element</span><span class="p">)</span>
<span class="p">{</span>
    <span class="kt">double</span> <span class="n">dpi</span> <span class="p">=</span> <span class="m">96</span><span class="p">;</span>
    <span class="kt">double</span> <span class="n">width</span> <span class="p">=</span> <span class="n">element</span><span class="p">.</span><span class="n">ActualWidth</span><span class="p">;</span>
    <span class="kt">double</span> <span class="n">height</span> <span class="p">=</span> <span class="n">element</span><span class="p">.</span><span class="n">ActualHeight</span><span class="p">;</span>

    <span class="n">DrawingVisual</span> <span class="n">drawingVisual</span> <span class="p">=</span> <span class="k">new</span> <span class="nf">DrawingVisual</span><span class="p">();</span>
    <span class="k">using</span> <span class="p">(</span><span class="n">DrawingContext</span> <span class="n">dc</span> <span class="p">=</span> <span class="n">drawingVisual</span><span class="p">.</span><span class="nf">RenderOpen</span><span class="p">())</span>
    <span class="p">{</span>
        <span class="n">VisualBrush</span> <span class="n">vb</span> <span class="p">=</span> <span class="k">new</span> <span class="nf">VisualBrush</span><span class="p">(</span><span class="n">element</span><span class="p">);</span>
        <span class="n">dc</span><span class="p">.</span><span class="nf">DrawRectangle</span><span class="p">(</span><span class="n">vb</span><span class="p">,</span> <span class="k">null</span><span class="p">,</span> <span class="k">new</span> <span class="nf">Rect</span><span class="p">(</span><span class="k">new</span> <span class="n">System</span><span class="p">.</span><span class="n">Windows</span><span class="p">.</span><span class="nf">Point</span><span class="p">(),</span> <span class="k">new</span> <span class="n">System</span><span class="p">.</span><span class="n">Windows</span><span class="p">.</span><span class="nf">Size</span><span class="p">(</span><span class="n">width</span><span class="p">,</span> <span class="n">height</span><span class="p">)));</span>
    <span class="p">}</span>

    <span class="n">RenderTargetBitmap</span> <span class="n">rtb</span> <span class="p">=</span> <span class="k">new</span> <span class="nf">RenderTargetBitmap</span><span class="p">((</span><span class="kt">int</span><span class="p">)</span><span class="n">Math</span><span class="p">.</span><span class="nf">Round</span><span class="p">(</span><span class="n">width</span><span class="p">),</span> <span class="p">(</span><span class="kt">int</span><span class="p">)</span><span class="n">Math</span><span class="p">.</span><span class="nf">Round</span><span class="p">(</span><span class="n">height</span><span class="p">),</span> <span class="n">dpi</span><span class="p">,</span> <span class="n">dpi</span><span class="p">,</span> <span class="n">PixelFormats</span><span class="p">.</span><span class="n">Default</span><span class="p">);</span>
    <span class="n">rtb</span><span class="p">.</span><span class="nf">Render</span><span class="p">(</span><span class="n">drawingVisual</span><span class="p">);</span>

    <span class="n">PngBitmapEncoder</span> <span class="n">enc</span> <span class="p">=</span> <span class="k">new</span> <span class="nf">PngBitmapEncoder</span><span class="p">();</span>
    <span class="n">enc</span><span class="p">.</span><span class="n">Frames</span><span class="p">.</span><span class="nf">Add</span><span class="p">(</span><span class="n">BitmapFrame</span><span class="p">.</span><span class="nf">Create</span><span class="p">(</span><span class="n">rtb</span><span class="p">));</span>
    <span class="k">using</span> <span class="p">(</span><span class="n">Stream</span> <span class="n">stm</span> <span class="p">=</span> <span class="n">File</span><span class="p">.</span><span class="nf">Create</span><span class="p">(</span><span class="s">"label.png"</span><span class="p">))</span>
    <span class="p">{</span>
        <span class="n">enc</span><span class="p">.</span><span class="nf">Save</span><span class="p">(</span><span class="n">stm</span><span class="p">);</span>
    <span class="p">}</span>
<span class="p">}</span>
</code></pre></div></div>]]></content><author><name> </name><email>oksujay1127@google.com</email></author><category term="WPF" /><summary type="html"><![CDATA[Capture WPF Control To Image, RenderTargetBitmap, PngBitmapEncorder]]></summary></entry><entry><title type="html">WPF : 32. ItemsControl의 헤더,셀 라인 맞추는 법(Grid.IsSharedSizeScope)</title><link href="https://jay1127.github.io/wpf/Align-Header-And-Cell-In-ItemsControl/" rel="alternate" type="text/html" title="WPF : 32. ItemsControl의 헤더,셀 라인 맞추는 법(Grid.IsSharedSizeScope)" /><published>2024-07-18T00:00:00+00:00</published><updated>2024-07-18T00:00:00+00:00</updated><id>https://jay1127.github.io/wpf/Align-Header-And-Cell-In-ItemsControl</id><content type="html" xml:base="https://jay1127.github.io/wpf/Align-Header-And-Cell-In-ItemsControl/"><![CDATA[<p><code class="language-plaintext highlighter-rouge">ItemsControl</code>을 이용해서 헤더+셀형식으로 테이블을 만든 경우, 헤더부분과 셀부분이 크기를 공유하지 않아 테이블이 어긋나 보이는 경우가 있다.</p>

<p><img src="https://github.com/user-attachments/assets/1b07a74d-510d-41c3-bb45-dce890ee3518" alt="image" class="align-center" width="500" /></p>

<p><img src="https://github.com/user-attachments/assets/1f7dfc92-e322-4aca-998b-edf6d09f9c16" alt="image" class="align-center" width="500" /></p>

<p><br /></p>

<p>다음과 같이 <code class="language-plaintext highlighter-rouge">ItemsControl</code>에 <code class="language-plaintext highlighter-rouge">Grid.IsSharedSizeScope="True"</code>로 설정하고, 공유하려는 헤더,셀 그리드의 <code class="language-plaintext highlighter-rouge">SharedSizeGroup</code>속성에 동일한 값을 지정하면, 해당 헤더와 셀의 크기가 공유되서 어긋나지 않는다.</p>

<div class="language-xml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nt">&lt;ItemsControl</span> <span class="na">Grid.IsSharedSizeScope=</span><span class="s">"True"</span>
              <span class="na">HorizontalAlignment=</span><span class="s">"Center"</span>
              <span class="na">VerticalAlignment=</span><span class="s">"Center"</span>
              <span class="na">ItemsSource=</span><span class="s">"{Binding Items}"</span><span class="nt">&gt;</span>
    <span class="nt">&lt;ItemsControl.ItemsPanel&gt;</span>
        <span class="nt">&lt;ItemsPanelTemplate&gt;</span>
            <span class="nt">&lt;StackPanel</span> <span class="na">Orientation=</span><span class="s">"Horizontal"</span> <span class="nt">/&gt;</span>
        <span class="nt">&lt;/ItemsPanelTemplate&gt;</span>
    <span class="nt">&lt;/ItemsControl.ItemsPanel&gt;</span>
    <span class="nt">&lt;ItemsControl.Template&gt;</span>
        <span class="nt">&lt;ControlTemplate</span> <span class="na">TargetType=</span><span class="s">"{x:Type ItemsControl}"</span><span class="nt">&gt;</span>
            <span class="nt">&lt;Grid&gt;</span>
                <span class="nt">&lt;Grid.ColumnDefinitions&gt;</span>
                    <span class="nt">&lt;ColumnDefinition</span> <span class="na">Width=</span><span class="s">"100"</span> <span class="nt">/&gt;</span>
                    <span class="nt">&lt;ColumnDefinition</span> <span class="nt">/&gt;</span>
                <span class="nt">&lt;/Grid.ColumnDefinitions&gt;</span>
                <span class="nt">&lt;Grid.RowDefinitions&gt;</span>
                    <span class="nt">&lt;RowDefinition</span> <span class="na">Height=</span><span class="s">"35"</span> <span class="nt">/&gt;</span>
                    <span class="nt">&lt;RowDefinition</span> <span class="na">MinHeight=</span><span class="s">"35"</span>
                                   <span class="na">Height=</span><span class="s">"auto"</span>
                                   <span class="na">SharedSizeGroup=</span><span class="s">"shared"</span> <span class="nt">/&gt;</span>
                <span class="nt">&lt;/Grid.RowDefinitions&gt;</span>

                <span class="nt">&lt;Label</span> <span class="na">Content=</span><span class="s">"Header1"</span>
                       <span class="na">Background=</span><span class="s">"LightGreen"</span>
                       <span class="na">BorderBrush=</span><span class="s">"Black"</span>
                       <span class="na">BorderThickness=</span><span class="s">"1"</span> <span class="nt">/&gt;</span>
                <span class="nt">&lt;Label</span> <span class="na">Content=</span><span class="s">"Header2"</span>
                       <span class="na">Background=</span><span class="s">"LightGreen"</span>
                       <span class="na">BorderBrush=</span><span class="s">"Black"</span>
                       <span class="na">BorderThickness=</span><span class="s">"1,0,1,1"</span>
                       <span class="na">Grid.Row=</span><span class="s">"1"</span> <span class="nt">/&gt;</span>

                <span class="nt">&lt;ItemsPresenter</span> <span class="na">Grid.Column=</span><span class="s">"1"</span>
                                <span class="na">Grid.RowSpan=</span><span class="s">"2"</span> <span class="nt">/&gt;</span>
            <span class="nt">&lt;/Grid&gt;</span>
        <span class="nt">&lt;/ControlTemplate&gt;</span>
    <span class="nt">&lt;/ItemsControl.Template&gt;</span>
    <span class="nt">&lt;ItemsControl.ItemTemplate&gt;</span>
        <span class="nt">&lt;DataTemplate&gt;</span>
            <span class="nt">&lt;Grid</span> <span class="na">Width=</span><span class="s">"50"</span><span class="nt">&gt;</span>
                <span class="nt">&lt;Grid.RowDefinitions&gt;</span>
                    <span class="nt">&lt;RowDefinition</span> <span class="na">Height=</span><span class="s">"35"</span> <span class="nt">/&gt;</span>
                    <span class="nt">&lt;RowDefinition</span> <span class="na">SharedSizeGroup=</span><span class="s">"shared"</span> <span class="nt">/&gt;</span>
                <span class="nt">&lt;/Grid.RowDefinitions&gt;</span>
                <span class="nt">&lt;TextBox</span> <span class="na">Text=</span><span class="s">"{Binding X1}"</span>
                         <span class="na">BorderBrush=</span><span class="s">"Black"</span>
                         <span class="na">BorderThickness=</span><span class="s">"1"</span>
                         <span class="na">Grid.Row=</span><span class="s">"0"</span> <span class="nt">/&gt;</span>
                <span class="nt">&lt;TextBox</span> <span class="na">Text=</span><span class="s">"{Binding X2}"</span>
                         <span class="na">TextWrapping=</span><span class="s">"Wrap"</span>
                         <span class="na">BorderBrush=</span><span class="s">"Black"</span>
                         <span class="na">BorderThickness=</span><span class="s">"1,0,1,1"</span>
                         <span class="na">Grid.Row=</span><span class="s">"1"</span> <span class="nt">/&gt;</span>
            <span class="nt">&lt;/Grid&gt;</span>
        <span class="nt">&lt;/DataTemplate&gt;</span>
    <span class="nt">&lt;/ItemsControl.ItemTemplate&gt;</span>
<span class="nt">&lt;/ItemsControl&gt;</span>
</code></pre></div></div>

<p><br /></p>

<p><img src="https://github.com/user-attachments/assets/61f52f81-f5e3-4361-acb2-b2670f46ada5" alt="image" class="align-center" width="500" /></p>]]></content><author><name> </name><email>oksujay1127@google.com</email></author><category term="WPF" /><summary type="html"><![CDATA[ItemsControl의 헤더,셀 라인 맞추는 법, Grid.IsSharedSizeScope, Align Header And Cell In ItemsControl, SharedSizeGroup]]></summary></entry><entry><title type="html">.NET : 13. MSB4236 : The SDK ‘Microsoft.NET.Sdk’ specified could not be found. 해결 방법</title><link href="https://jay1127.github.io/csharp/Fix-MSB2436/" rel="alternate" type="text/html" title=".NET : 13. MSB4236 : The SDK ‘Microsoft.NET.Sdk’ specified could not be found. 해결 방법" /><published>2024-03-05T00:00:00+00:00</published><updated>2024-03-05T00:00:00+00:00</updated><id>https://jay1127.github.io/csharp/Fix-MSB2436</id><content type="html" xml:base="https://jay1127.github.io/csharp/Fix-MSB2436/"><![CDATA[<p>.NET SDK를 설치한 후에도 다음과 같은 에러가 발생하는 경우,</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>The SDK 'Microsoft.NET.Sdk' specified could not be found
</code></pre></div></div>

<p>명령참에 <code class="language-plaintext highlighter-rouge">dotnet --info</code>를 입력하여 설치 여부를 확인한다. (.NET SDKs intalled 라인을 확인하면, 설치된 SDK를 못찾고 있는 것을 확인할 수 있다.)</p>

<p><img src="https://github.com/Jay1127/Jay1127.github.io/assets/38006679/657ba59b-0c0b-4c5d-a8d1-8ad7a11c8433" alt="image" /></p>

<p><br />
원인은 <code class="language-plaintext highlighter-rouge">x86</code>, <code class="language-plaintext highlighter-rouge">x64</code> .NET SDK가 모두 설치되서 SDK를 못찾는 경우로, 환경 변수를 편집해서 해결할 수 있다.</p>

<p>환경 변수창에서 <code class="language-plaintext highlighter-rouge">x86</code> .NET SDK의 경로가 <code class="language-plaintext highlighter-rouge">x64</code> .NET SDK보다 상위에 있는 경우,</p>

<p><img src="https://github.com/Jay1127/Jay1127.github.io/assets/38006679/e80b9ce5-04a8-4f98-ae32-888c309d7527" alt="image" /></p>

<p><br />
다음과 같이 <code class="language-plaintext highlighter-rouge">x64</code> .NET SDK의 경로를 상위로 이동시킨다.</p>

<p><img src="https://github.com/Jay1127/Jay1127.github.io/assets/38006679/6ce096d9-e81e-4257-beba-a03e22a15109" alt="image" /></p>

<p><br /></p>

<p>다시 명령창에서 확인하면 SDK가 제대로 설치된 것을 확인할 수 있다.(빌드 에러도 해결)</p>

<p><img src="https://github.com/Jay1127/Jay1127.github.io/assets/38006679/301fba43-a95d-4314-9e3c-9fd159896f30" alt="image" /></p>]]></content><author><name> </name><email>oksujay1127@google.com</email></author><category term="CSharp" /><summary type="html"><![CDATA[MSB4236, The SDK 'Microsoft.NET.Sdk' specified could not be found. .NET Migration]]></summary></entry><entry><title type="html">.NET : 12. ENC0003: Updating ‘attribute’ requires restarting the application 해결 방법</title><link href="https://jay1127.github.io/csharp/Fix-ENC0003/" rel="alternate" type="text/html" title=".NET : 12. ENC0003: Updating ‘attribute’ requires restarting the application 해결 방법" /><published>2024-03-04T00:00:00+00:00</published><updated>2024-03-04T00:00:00+00:00</updated><id>https://jay1127.github.io/csharp/Fix-ENC0003</id><content type="html" xml:base="https://jay1127.github.io/csharp/Fix-ENC0003/"><![CDATA[<p>.NET 8.0에서 비쥬얼 스튜디오의 <code class="language-plaintext highlighter-rouge">Hot Reload</code>기능 사용 시, 다음과 같은 메시지가 발생 후, 진행이 불가하여 프로젝트를 재실행해야하는 경우가 발생한다.</p>

<div class="language-csharp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">AssemblyInfo</span><span class="p">.</span><span class="n">cs</span> <span class="p">:</span> <span class="n">ENC0003</span><span class="p">:</span> <span class="n">Updating</span> <span class="err">'</span><span class="n">attribute</span><span class="err">'</span> <span class="n">requires</span> <span class="n">restarting</span> <span class="n">the</span> <span class="n">application</span>
</code></pre></div></div>

<p>해결 방법은 전체 프로젝트에 <code class="language-plaintext highlighter-rouge">EnableSourceControlManagerQueries</code>을 <code class="language-plaintext highlighter-rouge">true</code>로 지정하면 된다. 다음과 같이 <code class="language-plaintext highlighter-rouge">Directory.Build.props</code>파일을 이용하여 전체 프로젝트에 해당 속성을 설정한다.</p>

<div class="language-xml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nt">&lt;Project&gt;</span>
  <span class="nt">&lt;PropertyGroup&gt;</span>
    <span class="nt">&lt;EnableSourceControlManagerQueries&gt;</span>true<span class="nt">&lt;/EnableSourceControlManagerQueries&gt;</span>
  <span class="nt">&lt;/PropertyGroup&gt;</span>
<span class="nt">&lt;/Project&gt;</span>
</code></pre></div></div>]]></content><author><name> </name><email>oksujay1127@google.com</email></author><category term="CSharp" /><summary type="html"><![CDATA[ENC0003, Updating 'attribute' requires restarting the application, VS Hot ReLoad, Debugging, EnableSourceControlManagerQueries]]></summary></entry><entry><title type="html">.NET : 11. CA1416 : This call site is reachable on all plaforms. ‘___’ is only supported on: ‘windows’ 해결방법</title><link href="https://jay1127.github.io/csharp/Fix-Warning-CA1416/" rel="alternate" type="text/html" title=".NET : 11. CA1416 : This call site is reachable on all plaforms. ‘___’ is only supported on: ‘windows’ 해결방법" /><published>2024-01-16T00:00:00+00:00</published><updated>2024-01-16T00:00:00+00:00</updated><id>https://jay1127.github.io/csharp/Fix-Warning-CA1416</id><content type="html" xml:base="https://jay1127.github.io/csharp/Fix-Warning-CA1416/"><![CDATA[<p>닷넷 마이그레인션 후 다음과 같이 <code class="language-plaintext highlighter-rouge">CA1416</code> 경고가 발생하는 경우,</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>CA1416 : This call site is reachable on all plaforms. ‘___’ is only supported on: ‘windows’
</code></pre></div></div>

<p><code class="language-plaintext highlighter-rouge">AssemblyInfo.cs</code>파일이 있는 경우, <code class="language-plaintext highlighter-rouge">SupportedOSPlatform</code>속성에 OS를 지정한다.</p>

<div class="language-csharp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">// AssemblyInfo.cs</span>
<span class="p">[</span><span class="n">assembly</span><span class="p">:</span> <span class="n">System</span><span class="p">.</span><span class="n">Runtime</span><span class="p">.</span><span class="n">Versioning</span><span class="p">.</span><span class="nf">SupportedOSPlatform</span><span class="p">(</span><span class="s">"windows"</span><span class="p">)]</span>
</code></pre></div></div>

<p><code class="language-plaintext highlighter-rouge">AssemblyInfo.cs</code>파일이 없는 경우, 프로젝트 파일에서 <code class="language-plaintext highlighter-rouge">GenerateAssemblyInfo</code>속성 값을 <code class="language-plaintext highlighter-rouge">true</code>로 설정한다.</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>// project.csproj
&lt;Project Sdk="Microsoft.NET.Sdk"&gt;
  &lt;PropertyGroup&gt;
    &lt;GenerateAssemblyInfo&gt;true&lt;/GenerateAssemblyInfo&gt;
  &lt;/PropertyGroup&gt;

	...
&lt;/Project&gt;
</code></pre></div></div>]]></content><author><name> </name><email>oksujay1127@google.com</email></author><category term="CSharp" /><summary type="html"><![CDATA[CA1416, This call site is reachable on all plaforms. ‘___’ is only supported on ‘windows’]]></summary></entry><entry><title type="html">OCCT : 6. Boolean Operation(Union, Difference, Intersection)</title><link href="https://jay1127.github.io/opencascade/Boolean-Operation-OCCT/" rel="alternate" type="text/html" title="OCCT : 6. Boolean Operation(Union, Difference, Intersection)" /><published>2023-07-13T00:00:00+00:00</published><updated>2023-07-13T00:00:00+00:00</updated><id>https://jay1127.github.io/opencascade/Boolean-Operation-OCCT</id><content type="html" xml:base="https://jay1127.github.io/opencascade/Boolean-Operation-OCCT/"><![CDATA[<p><img src="https://github.com/Jay1127/Jay1127.github.io/assets/38006679/90706926-9837-4eeb-b1d5-e3d21e09e768" alt="image" class="align-center" width="700" /></p>

<h3 id="unionbrepalgoapi_fuse">Union(BRepAlgoAPI_Fuse)</h3>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">gp_Pnt</span> <span class="n">corner1</span> <span class="o">=</span> <span class="n">gp_Pnt</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">);</span>
<span class="n">gp_Pnt</span> <span class="n">corner2</span> <span class="o">=</span> <span class="n">gp_Pnt</span><span class="p">(</span><span class="mi">1000</span><span class="p">,</span> <span class="mi">100</span><span class="p">,</span> <span class="mi">100</span><span class="p">);</span>
<span class="n">TopoDS_Shape</span> <span class="n">box1</span> <span class="o">=</span> <span class="n">BRepPrimAPI_MakeBox</span><span class="p">(</span><span class="n">corner1</span><span class="p">,</span> <span class="n">corner2</span><span class="p">);</span>

<span class="n">gp_Pnt</span> <span class="n">corner3</span> <span class="o">=</span> <span class="n">gp_Pnt</span><span class="p">(</span><span class="mi">450</span><span class="p">,</span> <span class="o">-</span><span class="mi">500</span><span class="p">,</span> <span class="mi">50</span><span class="p">);</span>
<span class="n">gp_Pnt</span> <span class="n">corner4</span> <span class="o">=</span> <span class="n">gp_Pnt</span><span class="p">(</span><span class="mi">550</span><span class="p">,</span> <span class="mi">500</span><span class="p">,</span> <span class="mi">150</span><span class="p">);</span>
<span class="n">TopoDS_Shape</span> <span class="n">box2</span> <span class="o">=</span> <span class="n">BRepPrimAPI_MakeBox</span><span class="p">(</span><span class="n">corner3</span><span class="p">,</span> <span class="n">corner4</span><span class="p">);</span>

<span class="n">TopoDS_Shape</span> <span class="n">fuse</span> <span class="o">=</span> <span class="n">BRepAlgoAPI_Fuse</span><span class="p">(</span><span class="n">box1</span><span class="p">,</span> <span class="n">box2</span><span class="p">);</span>
</code></pre></div></div>

<p><img src="https://github.com/Jay1127/Jay1127.github.io/assets/38006679/385110a5-6101-4711-834c-67329187eee5" alt="image" class="align-center" width="700" /></p>

<h3 id="differencebrepalgoapi_cut">Difference(BRepAlgoAPI_Cut)</h3>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">gp_Pnt</span> <span class="n">corner1</span> <span class="o">=</span> <span class="n">gp_Pnt</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">);</span>
<span class="n">gp_Pnt</span> <span class="n">corner2</span> <span class="o">=</span> <span class="n">gp_Pnt</span><span class="p">(</span><span class="mi">1000</span><span class="p">,</span> <span class="mi">100</span><span class="p">,</span> <span class="mi">100</span><span class="p">);</span>
<span class="n">TopoDS_Shape</span> <span class="n">box1</span> <span class="o">=</span> <span class="n">BRepPrimAPI_MakeBox</span><span class="p">(</span><span class="n">corner1</span><span class="p">,</span> <span class="n">corner2</span><span class="p">);</span>

<span class="n">gp_Pnt</span> <span class="n">corner3</span> <span class="o">=</span> <span class="n">gp_Pnt</span><span class="p">(</span><span class="mi">450</span><span class="p">,</span> <span class="o">-</span><span class="mi">500</span><span class="p">,</span> <span class="mi">50</span><span class="p">);</span>
<span class="n">gp_Pnt</span> <span class="n">corner4</span> <span class="o">=</span> <span class="n">gp_Pnt</span><span class="p">(</span><span class="mi">550</span><span class="p">,</span> <span class="mi">500</span><span class="p">,</span> <span class="mi">150</span><span class="p">);</span>
<span class="n">TopoDS_Shape</span> <span class="n">box2</span> <span class="o">=</span> <span class="n">BRepPrimAPI_MakeBox</span><span class="p">(</span><span class="n">corner3</span><span class="p">,</span> <span class="n">corner4</span><span class="p">);</span>

<span class="n">TopoDS_Shape</span> <span class="n">cut</span> <span class="o">=</span> <span class="n">BRepAlgoAPI_Cut</span><span class="p">(</span><span class="n">box1</span><span class="p">,</span> <span class="n">box2</span><span class="p">);</span>
</code></pre></div></div>

<p><img src="https://github.com/Jay1127/Jay1127.github.io/assets/38006679/b48773d2-8703-4e0c-9332-1504614497a2" alt="image" class="align-center" width="700" /></p>

<h3 id="intersectionbrepalgoapi_common">Intersection(BRepAlgoAPI_Common)</h3>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">gp_Pnt</span> <span class="n">corner1</span> <span class="o">=</span> <span class="n">gp_Pnt</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">);</span>
<span class="n">gp_Pnt</span> <span class="n">corner2</span> <span class="o">=</span> <span class="n">gp_Pnt</span><span class="p">(</span><span class="mi">1000</span><span class="p">,</span> <span class="mi">100</span><span class="p">,</span> <span class="mi">100</span><span class="p">);</span>
<span class="n">TopoDS_Shape</span> <span class="n">box1</span> <span class="o">=</span> <span class="n">BRepPrimAPI_MakeBox</span><span class="p">(</span><span class="n">corner1</span><span class="p">,</span> <span class="n">corner2</span><span class="p">);</span>

<span class="n">gp_Pnt</span> <span class="n">corner3</span> <span class="o">=</span> <span class="n">gp_Pnt</span><span class="p">(</span><span class="mi">450</span><span class="p">,</span> <span class="o">-</span><span class="mi">500</span><span class="p">,</span> <span class="mi">50</span><span class="p">);</span>
<span class="n">gp_Pnt</span> <span class="n">corner4</span> <span class="o">=</span> <span class="n">gp_Pnt</span><span class="p">(</span><span class="mi">550</span><span class="p">,</span> <span class="mi">500</span><span class="p">,</span> <span class="mi">150</span><span class="p">);</span>
<span class="n">TopoDS_Shape</span> <span class="n">box2</span> <span class="o">=</span> <span class="n">BRepPrimAPI_MakeBox</span><span class="p">(</span><span class="n">corner3</span><span class="p">,</span> <span class="n">corner4</span><span class="p">);</span>

<span class="n">TopoDS_Shape</span> <span class="n">common</span> <span class="o">=</span> <span class="n">BRepAlgoAPI_Common</span><span class="p">(</span><span class="n">box1</span><span class="p">,</span> <span class="n">box2</span><span class="p">);</span>
</code></pre></div></div>

<p><img src="https://github.com/Jay1127/Jay1127.github.io/assets/38006679/474b743b-83ac-45a8-9668-e0c7ecf8eb56" alt="image" class="align-center" width="700" /></p>]]></content><author><name> </name><email>oksujay1127@google.com</email></author><category term="opencascade" /><summary type="html"><![CDATA[OCCT Boolean Operation(Union, Difference, Intersection), opencascade, occt]]></summary></entry></feed>