<?xml version="1.0" encoding="utf-8"?>
<rss xmlns:atom="https://www.w3.org/2005/Atom" xmlns:sy="https://purl.org/rss/1.0/modules/syndication/" xmlns:dc="https://purl.org/dc/elements/1.1/" xmlns:content="https://purl.org/rss/1.0/modules/content/" xmlns:wfw="https://wellformedweb.org/CommentAPI/" xmlns:slash="https://purl.org/rss/1.0/modules/slash/"
  version="2.0">
  <channel>
    <title>Denis Stankovski's blog</title>
    <atom:link
      href="https://docs.microsoft.com/archive/blogs/stankovski/feed.xml"
      rel="self"
      type="application/rss+xml" />
    <link>https://docs.microsoft.com/archive/blogs/stankovski/feed.xml</link>
    <description>Stuff on anything .NET</description>
    <lastBuildDate>Wed, 17 Apr 2019 03:50:40 GMT</lastBuildDate>
    <language>en-US</language>
    <sy:updatePeriod>hourly</sy:updatePeriod>
    <sy:updateFrequency>1</sy:updateFrequency>
    <item>
      <title>How we do Pair Programming</title>
      <link>https://docs.microsoft.com/archive/blogs/stankovski/how-we-do-pair-programming</link>
      <pubDate>Mon, 20 Oct 2014 12:19:00 GMT</pubDate>
      <dc:creator><![CDATA[denis_stankovski]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/stankovski/2014/10/20/how-we-do-pair-programming/</guid>
      <description><![CDATA[Our team is responsible for developing and maintaining all of Azure Management SDK which includes...]]></description>
      <content:encoded><![CDATA[<p>Our team is responsible for developing and maintaining all of Azure Management SDK which includes quite a bit of languages and tool. For example, we own .NET SDK (<a href="https://github.com/Azure/azure-sdk-for-net">https://github.com/Azure/azure-sdk-for-net</a>), PowerShell Toolset (<a href="https://github.com/Azure/azure-sdk-tools-pr">https://github.com/Azure/azure-sdk-tools-pr</a>), Java SDK (<a href="https://github.com/Azure/azure-sdk-for-java">https://github.com/Azure/azure-sdk-for-java</a>), Node JS SDK (<a href="https://github.com/Azure/azure-sdk-for-node">https://github.com/Azure/azure-sdk-for-node</a>), XPlat CLI Toolset (<a href="https://github.com/Azure/azure-sdk-tools-xplat">https://github.com/Azure/azure-sdk-tools-xplat</a>), PHP SDK (<a href="https://github.com/Azure/azure-sdk-for-php">https://github.com/Azure/azure-sdk-for-php</a>), as well as a pretty complex internal code generation platform. That being said we are a rather small team and until recently had at max 1-2 devs expert in each language/platform. That obviously presented a few issues. To gain maximum efficiency our PMs would always have to give us a diverse mix of tasks that included all of the languages and platforms. Whenever there was a big event such as //build or TechEd and the deliverables piled up (usually PowerShell and XPlat CLI got hit the worst) some team members had to work late hours while others were not really able to help. Also the daily scrums were kind of boring, since people could not really relate to what everyone else was doing.</p>
<p>So, to make the long story short, we have discussed at our last retrospective that our team would probably benefit from doing XP style pair programming (we have recently moved into an open space and the room setup was congruent to pairing). Since we didn&rsquo;t have any XP practitioners on our team I have shot an email to our in-house Agile guru Arlo Belshee (<a href="https://arlobelshee.com/">https://arlobelshee.com/</a>) who has generously agreed to come over to coach our team.</p>
<p>Here is what we have decided to do:<br />1.&nbsp;Do 2 pairing sessions a day &ndash; 90 minutes in the morning and 90 minutes in the afternoon. This arrangement gives us enough time to answer emails and review GitHub pull requests while letting us have 100% focus during the pairing sessions. By the way, pairing is intense. Doing 8 hrs a day of straight pairing will fry your brain!<br />2.&nbsp;Use the thinker/typer approach for coding tasks (not sure what is the official XP name for this) &ndash; one person types and one person thinks. The one typing is not allowed to type on his/her own. The moment the typer wants to contribute he/she needs to push out the keyboard. If both people want to &ldquo;think&rdquo; they need to discuss. This is by far the best pairing strategy we&rsquo;ve found, which prevents the person who is not typing from falling asleep.<br />3.&nbsp;Change partners every session. That works for us. <br />4.&nbsp;Change work items every session. One person from the pair stays on the work items (if it takes more than 1 session to complete the item) and the other should go. Another rule is that a person can&rsquo;t stay on a single task for more than 2 sessions!<br />5.&nbsp;Picking the right pair &ndash; initially we&rsquo;ve agreed to do a mix of an expert with someone new to the area. For example someone who knows PowerShell pairs with a Java guys on a PowerShell task. This enables for the fastest knowledge dissemination. Later on, as the knowledge becomes more even, so will the pairs get more even.<br />6.&nbsp;Use the whiteboard to track work items and tasks. Before the session begins we write down all work items that are up for pairing on the board and discuss which exactly steps need to be done. The people volunteer for pairs and the names are written down on the board next to the items. Finally as work gets done, the tasks get crossed out one by one.<br />7.&nbsp;Pick easily &ldquo;pairable&rdquo; items, expanding the set of &ldquo;pairable&rdquo; items as we go. Here is a diagram that Arlo drew:<br />&nbsp;<a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/61/10/7180.pairing.jpg" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-61-10/7180.pairing.jpg"><img src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/61/10/7180.pairing.jpg" original-url="https://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-01-61-10/7180.pairing.jpg" alt="" border="0" /></a><br />Initially we took just small simple coding problems that we knew how to solve while keeping a more complicated items for individual work. As time went by we started picking more complex items as well as non-coding research tasks. The goal is to make all work items &ldquo;pairable&rdquo;.<br />8.&nbsp;Do a brief retrospective on Tuesdays and Thursdays to micro-adjust our new process</p>
<p>So far we&rsquo;ve been doing this approach for 3.5 weeks and based on the team feedback its working great for everyone. By the way, if you are going to try pairing, make sure to try pairing for the entire month before making the decision (Arlo&rsquo;s suggestion). The first few days you will see a dramatic improvements. The 2nd - 3rd week you may start to hate it (the brain will rebel against someone always telling it what to do and will just shut down). The 3rd &ndash; 4th week is when you will get into the rhythm and will wonder how you were able to code without a partner before.</p>
<p>So here is where we are today. The team is now able to work on literally any codebase. Some quotes from the retrospectives have been &ldquo;this is the most fun I&rsquo;ve had coding in the past 6 months&rdquo;, or &ldquo;I have learned in one session more than I have learned in a long time being stuck doing X&rdquo;. By the way, as you may imagine the main fear of our PMs has been that while we are learning and stuff we would stop delivering as many story points (2 people on 1 keyboard). The reality has been quite the opposite. We&rsquo;ve started pairing in Sprint 39 and have finished more points than in Sprint 38. Now we are in Sprint 40 and have one week left to go. Based on velocity chart we should be complete if not more than at least as many story points as in the last sprint. Also our flow (we&rsquo;re doing a mix of Scrum and Kanban) has become much more even. We max a max of 4-5 items in Active state, as opposed to 10-15 in the past.</p>
<p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/61/10/3326.burndown.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-61-10/3326.burndown.png"><img src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/61/10/3326.burndown.png" original-url="https://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-01-61-10/3326.burndown.png" alt="" border="0" /></a></p>
<p><br />So overall I would say this has been quite a successful experiment. Feel free to post comments or email me if you&rsquo;d like more details on how pairing is working out for us.</p>]]></content:encoded>
    </item>
    <item>
      <title>Yet Another Scrollable TextBlock for Windows Phone</title>
      <link>https://docs.microsoft.com/archive/blogs/stankovski/yet-another-scrollable-textblock-for-windows-phone</link>
      <pubDate>Tue, 27 Aug 2013 10:16:00 GMT</pubDate>
      <dc:creator><![CDATA[denis_stankovski]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/stankovski/2013/08/27/yet-another-scrollable-textblock-for-windows-phone/</guid>
      <description><![CDATA[I have a personal Windows Phone (WP8) project where I needed to display a large amount of scrollable...]]></description>
      <content:encoded><![CDATA[<p>I have a personal Windows Phone (WP8) project where I needed to display a large amount of scrollable text on the screen while ideally taking a fraction of a second for loading. While searching the web I came across a few solutions, the most popular being the one by Alex Yakhnin in his blog called "Creating Scrollable TextBlock for WP7" (<a href="https://blogs.msdn.com/b/priozersk/archive/2010/09/08/creating-scrollable-textblock-for-wp7.aspx">https://blogs.msdn.com/b/priozersk/archive/2010/09/08/creating-scrollable-textblock-for-wp7.aspx</a>). That's what I started using initially, however I immediately ran across performance issues. For a relatively large block of text it would take me somewhere around 5 seconds to finish rendering. Also, the memory footprint would be quite substantial for such large amounts of text. So I went ahead and have improved performance of Alex's control to load in under 500ms and utilize virtualization available via various ListBoxes (I've used <a href="https://www.telerik.com/products/windows-phone/overview/all-controls/databoundlistbox.aspx">RadDataBoundListBox</a> from Telerik, but you can use any other similar control).</p>
<p>To accomplish my task I have encapsulated the "splitting" logic into a separate class that produces the output as a List of strings. You can then bind that list to your favorite ListBox control and voila, you have a ginormous text block. Few things to notice about the TextBlockSplitter class. First of all, since I'm using a TextBlock control for text measurement and splitting, execution of the splitting code has to be done on the UI thread, otherwise you will get a nasty runtime exception. Second, and probably more important, is that the code has been optimized for performance and not text flow. For example, you may see something like this:</p>
<p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/61/10/4846.scrollabletext1.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-61-10/4846.scrollabletext1.png"><img width="319" height="165" alt="" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/61/10/4846.scrollabletext1.png" original-url="https://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-01-61-10/4846.scrollabletext1.png" border="0"></a></p>
<p>The logic can be optimized for text flow, but the performance will probably go down slightly...</p>
<p>So here is the code for the <strong>TextBlockSplitter</strong> class:</p>
<pre class="code"><span style="background: white; color: black;">    </span><span style="background: white; color: blue;">public class </span><span style="background: white; color: rgb(43, 145, 175);">TextBlockSplitter
    </span><span style="background: white; color: black;">{
        </span><span style="background: white; color: blue;">private </span><span style="background: white; color: rgb(43, 145, 175);">TextBlock </span><span style="background: white; color: black;">measureBlock;
        </span><span style="background: white; color: blue;">private const double </span><span style="background: white; color: black;">maxHeight = 2048;

        </span><span style="background: white; color: blue;">public </span><span style="background: white; color: rgb(43, 145, 175);">FontFamily </span><span style="background: white; color: black;">FontFamily { </span><span style="background: white; color: blue;">get</span><span style="background: white; color: black;">; </span><span style="background: white; color: blue;">set</span><span style="background: white; color: black;">; }

        </span><span style="background: white; color: blue;">private </span><span style="background: white; color: black;">TextBlockSplitter()
        {
            measureBlock = GenerateTextBlock();
        }

        </span><span style="background: white; color: blue;">private static </span><span style="background: white; color: rgb(43, 145, 175);">TextBlockSplitter </span><span style="background: white; color: black;">instance;
        </span><span style="background: white; color: blue;">public static </span><span style="background: white; color: rgb(43, 145, 175);">TextBlockSplitter </span><span style="background: white; color: black;">Instance
        {
            </span><span style="background: white; color: blue;">get
            </span><span style="background: white; color: black;">{
                </span><span style="background: white; color: blue;">if </span><span style="background: white; color: black;">(instance == </span><span style="background: white; color: blue;">null</span><span style="background: white; color: black;">)
                    instance = </span><span style="background: white; color: blue;">new </span><span style="background: white; color: rgb(43, 145, 175);">TextBlockSplitter</span><span style="background: white; color: black;">();
                </span><span style="background: white; color: blue;">return </span><span style="background: white; color: black;">instance;
            }
        }

        </span><span style="background: white; color: blue;">private </span><span style="background: white; color: rgb(43, 145, 175);">TextBlock </span><span style="background: white; color: black;">GenerateTextBlock()
        {
            </span><span style="background: white; color: rgb(43, 145, 175);">TextBlock </span><span style="background: white; color: black;">textBlock = </span><span style="background: white; color: blue;">new </span><span style="background: white; color: rgb(43, 145, 175);">TextBlock</span><span style="background: white; color: black;">();
            textBlock.TextWrapping = </span><span style="background: white; color: rgb(43, 145, 175);">TextWrapping</span><span style="background: white; color: black;">.Wrap;
            textBlock.Margin = </span><span style="background: white; color: blue;">new </span><span style="background: white; color: rgb(43, 145, 175);">Thickness</span><span style="background: white; color: black;">(10);
            </span><span style="background: white; color: blue;">return </span><span style="background: white; color: black;">textBlock;
        }

        </span><span style="background: white; color: blue;">public </span><span style="background: white; color: rgb(43, 145, 175);">IList</span><span style="background: white; color: black;">&lt;</span><span style="background: white; color: blue;">string</span><span style="background: white; color: black;">&gt; Split(</span><span style="background: white; color: blue;">string </span><span style="background: white; color: black;">value, </span><span style="background: white; color: blue;">double </span><span style="background: white; color: black;">fontSize, </span><span style="background: white; color: rgb(43, 145, 175);">FontWeight </span><span style="background: white; color: black;">fontWeight, </span><span style="background: white; color: blue;">double </span><span style="background: white; color: black;">screenWidth)
        {
            </span><span style="background: white; color: rgb(43, 145, 175);">List</span><span style="background: white; color: black;">&lt;</span><span style="background: white; color: blue;">string</span><span style="background: white; color: black;">&gt; parsedText = </span><span style="background: white; color: blue;">new </span><span style="background: white; color: rgb(43, 145, 175);">List</span><span style="background: white; color: black;">&lt;</span><span style="background: white; color: blue;">string</span><span style="background: white; color: black;">&gt;();
            </span><span style="background: white; color: rgb(43, 145, 175);">StringReader </span><span style="background: white; color: black;">reader = </span><span style="background: white; color: blue;">new </span><span style="background: white; color: rgb(43, 145, 175);">StringReader</span><span style="background: white; color: black;">(value);
            measureBlock.FontSize = fontSize;
            measureBlock.FontWeight = fontWeight;
            measureBlock.Width = screenWidth;

            </span><span style="background: white; color: blue;">int </span><span style="background: white; color: black;">maxTextCount = </span><span style="background: white; color: blue;">this</span><span style="background: white; color: black;">.GetMaxTextSize();

            </span><span style="background: white; color: blue;">if </span><span style="background: white; color: black;">(value.Length &lt; maxTextCount)
            {
                parsedText.Add(value);
            }
            </span><span style="background: white; color: blue;">else
            </span><span style="background: white; color: black;">{
                </span><span style="background: white; color: blue;">while </span><span style="background: white; color: black;">(reader.Peek() &gt; 0)
                {
                    </span><span style="background: white; color: blue;">string </span><span style="background: white; color: black;">line = reader.ReadLine();
                    parsedText.AddRange(ParseLine(line, maxTextCount));
                }
            }
            </span><span style="background: white; color: blue;">return </span><span style="background: white; color: black;">parsedText;
        }

        </span><span style="background: white; color: blue;">private </span><span style="background: white; color: rgb(43, 145, 175);">IList</span><span style="background: white; color: black;">&lt;</span><span style="background: white; color: blue;">string</span><span style="background: white; color: black;">&gt; ParseLine(</span><span style="background: white; color: blue;">string </span><span style="background: white; color: black;">line, </span><span style="background: white; color: blue;">int </span><span style="background: white; color: black;">maxTextCount)
        {
            </span><span style="background: white; color: blue;">int </span><span style="background: white; color: black;">maxLineCount = GetMaxLineCount();
            </span><span style="background: white; color: blue;">string </span><span style="background: white; color: black;">tempLine = line;
            </span><span style="background: white; color: blue;">var </span><span style="background: white; color: black;">parsedText = </span><span style="background: white; color: blue;">new </span><span style="background: white; color: rgb(43, 145, 175);">List</span><span style="background: white; color: black;">&lt;</span><span style="background: white; color: blue;">string</span><span style="background: white; color: black;">&gt;();

            </span><span style="background: white; color: blue;">try
            </span><span style="background: white; color: black;">{
                </span><span style="background: white; color: blue;">while </span><span style="background: white; color: black;">(tempLine.Trim().Length &gt; 0)
                {
                    </span><span style="background: white; color: blue;">int </span><span style="background: white; color: black;">charactersFitted = GetCharactersThatFit(tempLine, maxTextCount);
                    parsedText.Add(tempLine.Substring(0, charactersFitted).Trim());
                    tempLine = tempLine.Substring(charactersFitted, tempLine.Length - (charactersFitted));
                }
            }
            </span><span style="background: white; color: blue;">catch </span><span style="background: white; color: black;">(</span><span style="background: white; color: rgb(43, 145, 175);">Exception </span><span style="background: white; color: black;">e)
            {
                </span><span style="background: white; color: green;">// Ignore
            </span><span style="background: white; color: black;">}
            </span><span style="background: white; color: blue;">return </span><span style="background: white; color: black;">parsedText;
        }

        </span><span style="background: white; color: blue;">private int </span><span style="background: white; color: black;">GetCharactersThatFit(</span><span style="background: white; color: blue;">string </span><span style="background: white; color: black;">text, </span><span style="background: white; color: blue;">int </span><span style="background: white; color: black;">maxTextCount)
        {
            </span><span style="background: white; color: blue;">int </span><span style="background: white; color: black;">maxLineLength = maxTextCount &gt; text.Length ? text.Length : maxTextCount;
            </span><span style="background: white; color: blue;">for </span><span style="background: white; color: black;">(</span><span style="background: white; color: blue;">int </span><span style="background: white; color: black;">i = maxLineLength - 1; i &gt; 1; i--)
            {
                </span><span style="background: white; color: blue;">if </span><span style="background: white; color: black;">(text[i] == </span><span style="background: white; color: rgb(163, 21, 21);">' '</span><span style="background: white; color: black;">)
                {
                    </span><span style="background: white; color: blue;">var </span><span style="background: white; color: black;">nHeight = MeasureString(text.Substring(0, i - 1)).Height;
                    </span><span style="background: white; color: blue;">if </span><span style="background: white; color: black;">(nHeight &lt;= maxHeight)
                        </span><span style="background: white; color: blue;">return </span><span style="background: white; color: black;">i;
                }
            }
            </span><span style="background: white; color: blue;">return </span><span style="background: white; color: black;">maxLineLength;
        }

        </span><span style="background: white; color: blue;">private </span><span style="background: white; color: rgb(43, 145, 175);">Size </span><span style="background: white; color: black;">MeasureString(</span><span style="background: white; color: blue;">string </span><span style="background: white; color: black;">text)
        {
            </span><span style="background: white; color: blue;">this</span><span style="background: white; color: black;">.measureBlock.Text = text;
            </span><span style="background: white; color: blue;">return new </span><span style="background: white; color: rgb(43, 145, 175);">Size</span><span style="background: white; color: black;">(measureBlock.ActualWidth, measureBlock.ActualHeight);
        }

        </span><span style="background: white; color: blue;">private int </span><span style="background: white; color: black;">GetMaxTextSize()
        {
            </span><span style="background: white; color: green;">// Get average char size
            </span><span style="background: white; color: rgb(43, 145, 175);">Size </span><span style="background: white; color: black;">size = </span><span style="background: white; color: blue;">this</span><span style="background: white; color: black;">.MeasureText(</span><span style="background: white; color: rgb(163, 21, 21);">" "</span><span style="background: white; color: black;">);
            </span><span style="background: white; color: green;">// Get number of char that fit in the line
            </span><span style="background: white; color: blue;">int </span><span style="background: white; color: black;">charLineCount = (</span><span style="background: white; color: blue;">int</span><span style="background: white; color: black;">)(measureBlock.Width / size.Width);
            </span><span style="background: white; color: green;">// Get line count
            </span><span style="background: white; color: blue;">int </span><span style="background: white; color: black;">lineCount = (</span><span style="background: white; color: blue;">int</span><span style="background: white; color: black;">)(maxHeight / size.Height);

            </span><span style="background: white; color: blue;">return </span><span style="background: white; color: black;">charLineCount * lineCount / 2;
        }

        </span><span style="background: white; color: blue;">private int </span><span style="background: white; color: black;">GetMaxLineCount()
        {
            </span><span style="background: white; color: rgb(43, 145, 175);">Size </span><span style="background: white; color: black;">size = </span><span style="background: white; color: blue;">this</span><span style="background: white; color: black;">.MeasureText(</span><span style="background: white; color: rgb(163, 21, 21);">" "</span><span style="background: white; color: black;">);
            </span><span style="background: white; color: green;">// Get number of char that fit in the line
            </span><span style="background: white; color: blue;">int </span><span style="background: white; color: black;">charLineCount = (</span><span style="background: white; color: blue;">int</span><span style="background: white; color: black;">)(measureBlock.Width / size.Width);
            </span><span style="background: white; color: green;">// Get line count
            </span><span style="background: white; color: blue;">int </span><span style="background: white; color: black;">lineCount = (</span><span style="background: white; color: blue;">int</span><span style="background: white; color: black;">)(maxHeight / size.Height) - 5;

            </span><span style="background: white; color: blue;">return </span><span style="background: white; color: black;">lineCount;
        }

        </span><span style="background: white; color: blue;">private </span><span style="background: white; color: rgb(43, 145, 175);">Size </span><span style="background: white; color: black;">MeasureText(</span><span style="background: white; color: blue;">string </span><span style="background: white; color: black;">value)
        {
            measureBlock.Text = value;
            </span><span style="background: white; color: blue;">return new </span><span style="background: white; color: rgb(43, 145, 175);">Size</span><span style="background: white; color: black;">(measureBlock.ActualWidth, measureBlock.ActualHeight);
        }
    }</span></pre><a href="https://11011.net/software/vspaste"></a>
<pre class="code">&nbsp;</pre>
<p>To use the code simply call the Split method passing in the necessary parameters:</p>
<pre class="code"><span style="background: white; color: blue;">var </span><span style="background: white; color: black;">splitText = </span><span style="background: white; color: rgb(43, 145, 175);">TextBlockSplitter</span><span style="background: white; color: black;">.Instance.Split(largeText, 20, </span><span style="background: white; color: rgb(43, 145, 175);">FontWeights</span><span style="background: white; color: black;">.Normal,
                                             </span><span style="background: white; color: rgb(43, 145, 175);">Application</span><span style="background: white; color: black;">.Current.Host.Content.ActualWidth);
Paragraphs = </span><span style="background: white; color: blue;">new </span><span style="background: white; color: rgb(43, 145, 175);">ObservableCollection</span><span style="background: white; color: black;">&lt;</span><span style="background: white; color: blue;">string</span><span style="background: white; color: black;">&gt;(splitText);</span></pre><a href="https://11011.net/software/vspaste"></a><pre class="code">&nbsp;</pre>
<p>That’s it. Hope you will find this useful.</p>
<p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Components.PostAttachments/00/10/44/46/09/TextBlockSplitter.zip" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-components-postattachments/00-10-44-46-09/TextBlockSplitter.zip">TextBlockSplitter.zip</a></p>]]></content:encoded>
    </item>
  </channel>
</rss>