{"id":269813,"date":"2015-12-07T21:20:02","date_gmt":"2015-12-07T18:20:02","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=269813"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=269813","title":{"rendered":"C# WPF \u2013 \u0421\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 ListView \u0441 \u00ab\u0431\u043b\u044d\u043a\u0434\u0436\u0435\u043a\u043e\u043c \u0438 \u2026\u00bb"},"content":{"rendered":"<br \/>\n<h1>\u0412\u0432\u0435\u0434\u0435\u043d\u0438\u0435<\/h1>\n<p>  \u041f\u0440\u0438\u0437\u043d\u0430\u0435\u043c \u0432\u0441\u0435, \u0447\u0442\u043e \u00abDotNetFramework\u00bb \u2014 \u0433\u0435\u043d\u0438\u0430\u043b\u044c\u043d\u043e\u0435 \u0438\u0437\u043e\u0431\u0440\u0435\u0442\u0435\u043d\u0438\u0435 Microsoft, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0432\u043d\u0443\u0448\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043d\u0430\u0431\u043e\u0440 \u0433\u043e\u0442\u043e\u0432\u044b\u0445 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432 \u0438 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0441\u0442\u0440\u043e\u0438\u0442\u044c \u041f\u041e \u043f\u043e \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0443 \u00abLEGO\u00bb. \u041d\u043e \u043d\u0435 \u0432\u0441\u0435\u0433\u0434\u0430 \u0438\u0445 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e, \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u0434\u043b\u044f \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0437\u0430\u0434\u0430\u0447, \u0442\u0440\u0435\u0431\u0443\u044e\u0449\u0438\u0445 \u043b\u0438\u0431\u043e \u00ab\u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0433\u043e \u0431\u044b\u0441\u0442\u0440\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f\u00bb, \u043b\u0438\u0431\u043e \u00ab\u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0433\u043e \u0441\u043f\u043e\u0441\u043e\u0431\u0430 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f\u00bb\u2026 \u0418 Microsoft \u0434\u0430\u0451\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0441\u0432\u043e\u0438 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b. \u0418\u0442\u0430\u043a, \u0445\u043e\u0447\u0443 \u043f\u043e\u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f \u043e\u043f\u044b\u0442\u043e\u043c \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0433\u043e ListView-\u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430 (\u0431\u0443\u0434\u0435\u043c \u043d\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u0442\u0430\u043a \u0432\u0438\u0434 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0432\u044b\u0432\u043e\u0434\u044f\u0442 \u0434\u043b\u044f \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0430 \u0441\u043f\u0438\u0441\u043e\u043a \u043a\u0430\u043a\u0438\u0445-\u043b\u0438\u0431\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432) \u2014 \u00ab\u043f\u043e-\u0431\u044b\u0441\u0442\u0440\u043e\u043c\u0443\u00bb (\u0432 \u0443\u0441\u043b\u043e\u0432\u0438\u044f\u0445, \u043a\u043e\u0433\u0434\u0430 \u043d\u0430\u0434\u043e \u0431\u044b\u043b\u043e \u0435\u0449\u0451 \u0432\u0447\u0435\u0440\u0430).<br \/>  <a name=\"habracut\"><\/a>  <\/p>\n<h1>\u041f\u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u0437\u0430\u0434\u0430\u0447\u0438<\/h1>\n<p>  \u041d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u0434\u043b\u044f \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0430 \u0441\u043f\u0438\u0441\u043a\u0430 \u043e\u0434\u043d\u043e\u0440\u043e\u0434\u043d\u044b\u0445 \u0438 \u043d\u0435\u043e\u0434\u043d\u043e\u0440\u043e\u0434\u043d\u044b\u0445 (\u0442.\u0435. \u0432 \u0441\u043f\u0438\u0441\u043a\u0435 \u0431\u0443\u0434\u0443\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u044c\u0441\u044f \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u044b \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0440\u0430\u0437\u043d\u044b\u0445 \u0442\u0438\u043f\u043e\u0432 (\u0432 \u0442\u043e\u043c \u0447\u0438\u0441\u043b\u0435 \u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0445)) \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 (\u0431\u043e\u043b\u0435\u0435 10000 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432). <br \/>  \u0414\u043e\u043b\u0436\u043d\u044b \u0431\u044b\u0442\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u00ab\u0440\u0430\u0441\u043a\u0440\u0430\u0448\u0438\u0432\u0430\u043d\u0438\u044f\u00bb \u0432\u0438\u0434\u0430 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u044d\u0442\u0438\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432. <br \/>  \u041d\u0443 \u0438 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u043e \u043a\u043b\u0438\u043a\u0443 \u043f\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 \u0434\u043e\u043b\u0436\u043d\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442\u044c \u0441\u043e\u0431\u044b\u0442\u0438\u0435, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0431\u0443\u0434\u0435\u0442 \u0434\u0430\u0432\u0430\u0442\u044c \u043d\u0430\u043c \u0441\u0441\u044b\u043b\u043a\u0443 \u043d\u0430 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0438 \u0435\u0433\u043e \u0438\u043d\u0434\u0435\u043a\u0441 \u0432 \u0441\u043f\u0438\u0441\u043a\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432.  <\/p>\n<h1>\u041f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442<\/h1>\n<p>  \u0417\u0430\u0431\u0435\u0433\u0430\u044f \u0432\u043f\u0435\u0440\u0451\u0434, \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c, \u0447\u0442\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c:<br \/>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/files\/678\/c0d\/c55\/678c0dc55bc84fbe9c346ba330c3cd92.png\"\/><br \/>  \u0420\u0438\u0441\u0443\u043d\u043e\u043a 1 \u2013 \u0428\u0430\u0431\u043b\u043e\u043d \u0441 \u0440\u0430\u0437\u043d\u044b\u043c\u0438 \u0440\u0430\u0437\u043c\u0435\u0440\u0430\u043c\u0438 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/files\/193\/846\/327\/1938463270b049c4b7a193b4986c71fc.png\"\/><br \/>  \u0420\u0438\u0441\u0443\u043d\u043e\u043a 2 \u2013 \u0428\u0430\u0431\u043b\u043e\u043d \u0441 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u043c\u0438 \u0440\u0430\u0437\u043c\u0435\u0440\u0430\u043c\u0438 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f<br \/>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/files\/397\/e17\/526\/397e175269524dc09d6c887c85449bdb.png\"\/><br \/>  \u0420\u0438\u0441\u0443\u043d\u043e\u043a 3 \u2013 \u041a\u043b\u0438\u043a \u043f\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443<br \/>  \u0418\u0442\u0430\u043a, \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043f\u043e\u0434\u0445\u043e\u0434 \u043a \u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430 \u0438 \u0443\u0433\u043b\u0443\u0431\u0438\u043c\u0441\u044f \u0432 \u043a\u043e\u0434.  <\/p>\n<h1>\u00ab\u041c\u0430\u0442.\u0447\u0430\u0441\u0442\u044c\u00bb \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430<\/h1>\n<p>  \u0412 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442\u0441\u044f \u0441\u043f\u0438\u0441\u043e\u043a \u0438\u0437 object-\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043d\u0430\u0431\u043e\u0440\u043e\u043c \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445. <br \/>  \u0414\u0435\u043b\u0435\u0433\u0430\u0442 \u043d\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u043a\u043e\u043d\u0432\u0435\u0440\u0442\u0430\u0446\u0438\u0438 \u0438\u0437 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u0433\u043e \u0442\u0438\u043f\u0430 \u0432 \u0448\u0430\u0431\u043b\u043e\u043d \u0434\u043b\u044f \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f (\u043a\u043b\u0430\u0441\u0441 BlockTamplateBase).<br \/>  \u0428\u0430\u0431\u043b\u043e\u043d \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f (\u043a\u043b\u0430\u0441\u0441 BlockTamplateBase) \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e\u0431 \u043e\u0431\u043b\u0430\u0441\u0442\u0438 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u044e, \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u044e\u0449\u0443\u044e \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0440\u0438\u0441\u043e\u0432\u0430\u043d\u0438\u044f.<br \/>  \u0420\u0430\u0437\u0431\u0435\u0440\u0451\u043c \u043f\u043e\u043b\u044f ListBlockView \u2013 \u041f\u0440\u0438\u043c\u0435\u0440 1.  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u041f\u0440\u0438\u043c\u0435\u0440 1<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code>        \/\/\/ &lt;summary&gt;         \/\/\/ \u0421\u043f\u0438\u0441\u043e\u043a \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 (\u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u043c \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u0435 &quot;\u043d\u0435\u043e\u0434\u043d\u043e\u0440\u043e\u0434\u043d\u043e\u0441\u0442\u0438 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432&quot;)         \/\/\/ &lt;\/summary&gt;         public List&lt;object&gt; SourceData { get; set; }           protected Brush colorChoosenBlockShadow;         \/\/\/ &lt;summary&gt;         \/\/\/ \u0426\u0432\u0435\u0442 \u0437\u0430\u0442\u0435\u043d\u0435\u043d\u0438\u044f \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 (\u043f\u043e \u043a\u043e\u0442\u043e\u0440\u043e\u043c\u0443 &quot;\u043a\u043b\u0438\u043a\u043d\u0443\u043b\u0438&quot;)         \/\/\/ &lt;\/summary&gt;         public Brush ColorChoosenBlockShadow { get { return colorChoosenBlockShadow; } set { colorChoosenBlockShadow = value; this.InvalidateVisual(); } }           public delegate BlockTemplateBase ConvertObjectToBlockTemplateDelegate(object item, int index);         \/\/\/ &lt;summary&gt;         \/\/\/ \u0423\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044e, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0431\u0443\u0434\u0435\u0442 \u043e\u043f\u0438\u0441\u0430\u043d \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0434\u043b\u044f \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f (\u0440\u0438\u0441\u0432\u043e\u0430\u043d\u0438\u044f) \u0434\u0430\u043d\u043d\u044b\u0445,         \/\/\/ \u0442.\u0435. \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 &quot;\u0440\u0430\u0441\u043a\u0440\u0430\u0441\u043a\u043e\u0439&quot; \u0432\u0438\u0434\u0430 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0438\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439         \/\/\/ (\u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u0435 \u043e &quot;\u0440\u0430\u0441\u043a\u0440\u0430\u0441\u043a\u0435&quot; \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432)         \/\/\/ (\u0414\u0430\u043b\u0435\u0435 \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u043e BlockTemplateBase)         \/\/\/ &lt;\/summary&gt;         public ConvertObjectToBlockTemplateDelegate ConvertToBlockTemplate { get; set; }                  \/\/\/ &lt;summary&gt;         \/\/\/ \u0421\u043f\u0438\u0441\u043e\u043a \u043e\u0431\u043b\u0430\u0441\u0442\u0435\u0439 (\u043f\u0440\u044f\u043c\u043e\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a\u043e\u0432), \u0432 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u0430\u043d\u044b \u0432\u0438\u0434\u044b\u043c\u044b\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0441\u043f\u0438\u0441\u043a\u0430 SourceData,         \/\/\/ \u043d\u0430\u0447\u0438\u043d\u0430\u044f \u0441 \u0438\u043d\u0434\u0435\u043a\u0441\u0430 IndexCurrentFirstVisibleBlock         \/\/\/ (\u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0434\u043b\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043a\u043b\u0438\u043a\u0430 \u043f\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443)         \/\/\/ &lt;\/summary&gt;         protected List&lt;Rect&gt; CurrentVisibleListBlockRect { get; set; }         \/\/\/ &lt;summary&gt;         \/\/\/ \u0418\u043d\u0434\u0435\u043a\u0441 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u0432\u0438\u0434\u0438\u043c\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 (\u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0434\u043b\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0441\u043a\u0440\u043e\u043b\u043b\u043d\u0438\u0433\u0430)         \/\/\/ &lt;\/summary&gt;         protected int IndexCurrentFirstVisibleBlock { get; set; }         \/\/\/ &lt;summary&gt;         \/\/\/ \u0418\u043d\u0434\u0435\u043a\u0441 \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 (\u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 &quot;\u0437\u0430\u0442\u0435\u043d\u044f\u0442\u044c\u0441\u044f&quot;)         \/\/\/ &lt;\/summary&gt;         public int IndexCurrentChoosenBlock { get; protected set; } <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  \u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u00ab\u041a\u043b\u0438\u043a\u0430 \u043f\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443\u00bb \u2014 \u041f\u0440\u0438\u043c\u0435\u0440 2. <br \/>  \u041c\u043e\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043e\u0431\u044b\u0447\u043d\u043e\u0435 \u0441\u043e\u0431\u044b\u0442\u0438\u0435, \u0430 \u043c\u043e\u0436\u043d\u043e \u2013 \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u0438\u0437\u0438\u0440\u0443\u0435\u043c\u043e\u0435. \u0414\u043b\u044f \u043c\u043e\u0435\u0439 \u0437\u0430\u0434\u0430\u0447\u0438 \u0438 \u043e\u0431\u044b\u0447\u043d\u043e\u0433\u043e \u0445\u0432\u0430\u0442\u0430\u0435\u0442.  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u041f\u0440\u0438\u043c\u0435\u0440 2<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code>        \/* \u041c\u0430\u0440\u0448\u0440\u0443\u0442\u0438\u0437\u0438\u0440\u0443\u0435\u043c\u043e\u0435 \u0441\u043e\u0431\u044b\u0442\u0438\u0435 \u00ab\u041a\u043b\u0438\u043a \u043f\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443\u00bb         public class ClickItemRoutedEventArgs : RoutedEventArgs         {             public int Index { get; protected set; }             public object Item { get; protected set; }             public ClickItemRoutedEventArgs(RoutedEvent routedEvent, object item, int index)                 : base(routedEvent)             {                 Item = item;                 Index = index;             }             public ClickItemRoutedEventArgs()                 : base()             {                 Item = null;                 Index = -1;             }           }         public static readonly RoutedEvent ClickItemEvent = EventManager.RegisterRoutedEvent(\u201cClickItem\u201d, RoutingStrategy.Bubble, typeof(RoutedEventHandler), typeof(ListBlockView));         public event RoutedEventHandler ClickItem         {             add { base.AddHandler(ClickItemEvent, value); }             remove { base.RemoveHandler(ClickItemEvent, value); }         }         void RaiseClickItem(object item, int index)         {             ClickItemRoutedEventArgs args = new ClickItemRoutedEventArgs(ClickItemEvent, item, index);             RaiseEvent(args);         }          * *\/           public class ClickDataItemEventArgs : EventArgs         {             public object Item { get; protected set; }             public int Index { get; protected set; }             public ClickDataItemEventArgs() : base() { Item = null; Index = -1; }             public ClickDataItemEventArgs(object item, int index) : base() { Item = item; Index = index; }         }         \/\/\/ &lt;summary&gt;         \/\/\/ \u0421\u043e\u0431\u044b\u0442\u0438\u0435 \u043a\u043b\u0438\u043a\u0430 \u043f\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443         \/\/\/ &lt;\/summary&gt;         public event EventHandler&lt;ClickDataItemEventArgs&gt; ClickItem;         protected void ClickItemRaiseEvent(object item, int index)         {             if (ClickItem != null)                 ClickItem(this, new ClickDataItemEventArgs(item, index));         } <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  \u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u00ab\u041a\u043b\u0438\u043a\u0430 \u043f\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443\u00bb \u043a\u0430\u043a \u043c\u044b\u0448\u043a\u043e\u0439, \u0442\u0430\u043a \u0438 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u0430\u044f \u2013 \u041f\u0440\u0438\u043c\u0435\u0440 3.  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u041f\u0440\u0438\u043c\u0435\u0440 3<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code>        protected override void OnMouseUp(MouseButtonEventArgs e)         {             base.OnMouseUp(e);             \/\/\u043e\u0431\u0445\u043e\u0434\u0438\u043c \u0441\u043f\u0438\u0441\u043e\u043a \u0441 \u043e\u0431\u043b\u0430\u0441\u0442\u044f\u043c\u0438 \u0440\u0435\u043d\u0434\u0435\u0440\u0438\u043d\u0433\u0430 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430             for (int i = this.CurrentVisibleListBlockRect.Count - 1; i &gt;= 0; i--)             {                 \/\/\u0435\u0441\u043b\u0438 \u043a\u0443\u0440\u0441\u043e\u0440 \u0432 \u043e\u0431\u043b\u0430\u0441\u0442\u0438 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430, \u0442\u043e \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u043c \u0435\u0433\u043e                 if (this.CurrentVisibleListBlockRect[i].Contains(e.GetPosition(this)))                 {                     IndexCurrentChoosenBlock = i + IndexCurrentFirstVisibleBlock;                     this.InvalidateVisual();                     this.ClickItemRaiseEvent(this.SourceData[IndexCurrentChoosenBlock], IndexCurrentChoosenBlock);                 }             }         }         \/\/\/ &lt;summary&gt;         \/\/\/ \u041f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u044b\u0439 \u0432\u044b\u0431\u043e\u0440 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u043f\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0443 \u0438 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u043a\u043b\u0438\u043a\u0430 \u043f\u043e \u043d\u0435\u043c\u0443         \/\/\/ &lt;\/summary&gt;         \/\/\/ &lt;param name=&quot;index&quot;&gt; \u0438\u043d\u0434\u0435\u043a\u0441 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 &lt;\/param&gt;         public void Select(int index)         {             int tempIndex = index;             if (this.SourceData.Count.Equals(0)) return;             if ((index &lt; 0) && (index &gt;= this.SourceData.Count))                 tempIndex = 0;             this.IndexCurrentChoosenBlock = tempIndex;             this.IndexCurrentFirstVisibleBlock = tempIndex;             this.InvalidateVisual();             ClickItemRaiseEvent(this.SourceData[this.IndexCurrentChoosenBlock], this.IndexCurrentChoosenBlock);         } <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  \u0410 \u0442\u0435\u043f\u0435\u0440\u044c \u0440\u0430\u0437\u0431\u0435\u0440\u0451\u043c \u0441\u0430\u043c\u043e\u0435 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u0435 \u2013 \u0440\u0435\u043d\u0434\u0435\u0440\u0438\u043d\u0433 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430. \u0412 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 4.  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u041f\u0440\u0438\u043c\u0435\u0440 4<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code>        \/\/\/ &lt;summary&gt;         \/\/\/ \u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u043a\u0438 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430         \/\/\/ &lt;\/summary&gt;         \/\/\/ &lt;param name=&quot;drawingContext&quot;&gt;\u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u0440\u0438\u0441\u043e\u0432\u0430\u043d\u0438\u044f&lt;\/param&gt;         protected override void OnRender(DrawingContext drawingContext)         {             base.OnRender(drawingContext);             \/\/\u0422\u0435\u043a\u0443\u0449\u0430\u044f \u0444\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0432\u044b\u0441\u043e\u0442\u0430 \u043e\u0431\u043b\u0430\u0441\u0442\u0438 \u0440\u0438\u0441\u043e\u0432\u0430\u043d\u0438\u044f             double currentHeight = this.RenderSize.Height - this.hScrollBar.RenderSize.Height;             \/\/\u0422\u0435\u043a\u0443\u0449\u0430\u044f \u0444\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0448\u0438\u0440\u0438\u043d\u0430 \u043e\u0431\u043b\u0430\u0441\u0442\u0438 \u0440\u0438\u0441\u043e\u0432\u0430\u043d\u0438\u044f             double currentWidth = this.RenderSize.Width - this.vScrollBar.RenderSize.Width;             \/\/\u041e\u0431\u043b\u0430\u0441\u0442\u044c \u0440\u0438\u0441\u043e\u0432\u0430\u043d\u0438\u044f (\u0432\u043d\u0435 \u044d\u0442\u043e\u0439 \u043e\u0431\u043b\u0430\u0441\u0442\u0438 \u0440\u0438\u0441\u043e\u0432\u0430\u0442\u044c \u043d\u0435\u043b\u044c\u0437\u044f)             Size clipSize = new Size(currentWidth, currentHeight);             \/\/\u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0432\u0430\u0435\u043c             drawingContext.PushClip(new RectangleGeometry(new Rect(new Point(0, 0), clipSize)));             if (this.SourceData.Count &lt;= 0) return;             \/\/\u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u0438\u043d\u0434\u0435\u043a\u0441 \u0440\u0438\u0441\u0443\u0435\u043c\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 (\u0431\u043b\u043e\u043a\u0430)             int tempIndex = this.IndexCurrentFirstVisibleBlock;             \/\/\u0442\u0435\u043a\u0443\u0449\u0430\u044f \u0442\u043e\u0447\u043a\u0430 \u0440\u0438\u0441\u043e\u0432\u0430\u043d\u0438\u044f \u043d\u0430 \u043a\u0430\u043d\u0432\u0430\u0441\u0435 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430             Point currentBlockRenderLocation = new Point(0,0);             \/\/\u0443\u0447\u0451\u0442 \u0433\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0441\u043a\u0440\u043e\u043b\u043b\u0438\u043d\u0433\u0430 (\u0435\u0441\u043b\u0438 \u043f\u043e\u043b\u0437\u0443\u043d\u043e\u043a \u043f\u0435\u0440\u0435\u0434\u0432\u0438\u043d\u0443\u0442) (\u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u043a\u043e\u0433\u0434\u0430 \u043d\u0435 \u043f\u043e\u043c\u0435\u0449\u0430\u0435\u0442\u0441\u044f \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u044d\u043b\u0435\u043c\u0435\u043d\u0442)             currentBlockRenderLocation.X = - this.hScrollBar.Value;             this.hScrollBar.Maximum = 0;             \/\/\u043e\u0447\u0438\u0441\u0442\u043a\u0430 \u0421\u043f\u0438\u0441\u043a\u0430 \u043e\u0431\u043b\u0430\u0441\u0442\u0435\u0439 (\u043f\u0440\u044f\u043c\u043e\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a\u043e\u0432), \u0432 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u0430\u043d\u044b \u0432\u0438\u0434\u044b\u043c\u044b\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0441\u043f\u0438\u0441\u043a\u0430 SourceData             this.CurrentVisibleListBlockRect.Clear();             \/\/\u0440\u0438\u0441\u0443\u0435\u043c \u0431\u043b\u043e\u043a\u0438 (\u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b) \u043f\u043e\u043a\u0430 \u043e\u043d\u0438 \u0432\u0438\u0434\u043d\u044b \u043d\u0430 \u044d\u043a\u0440\u0430\u043d\u0435 (\u043a\u0430\u043d\u0432\u0430\u0441\u0435 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430)             while (currentBlockRenderLocation.Y &lt; currentHeight)             {                 if (this.ConvertToBlockTemplate == null) return;                 if (tempIndex &gt;= this.SourceData.Count) return;                                  \/\/\u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0435\u043c \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u0433\u043e \u0442\u0438\u043f\u0430 \u0432 \u0443\u043d\u0438\u0432\u0435\u0440\u0441\u0430\u043b\u044c\u043d\u044b\u0439 \u0448\u0430\u0431\u043b\u043e\u043d \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f                 \/\/\u0434\u0430\u043d\u043d\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430                 BlockTemplateBase currentRenderedBlock = this.ConvertToBlockTemplate(this.SourceData[tempIndex], tempIndex);                                  \/\/\u0440\u0435\u043d\u0434\u0435\u0440\u0438\u043c \u0448\u0430\u0431\u043b\u043e\u043d                 DrawingVisual currentBlockBuffer =  currentRenderedBlock.Render(currentBlockRenderLocation);                 \/\/\u0440\u0438\u0441\u0443\u0435\u043c \u0435\u0433\u043e \u043d\u0430 \u043a\u0430\u043d\u0432\u0430\u0441\u0435 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430                 drawingContext.DrawDrawing(currentBlockBuffer.Drawing);                   \/\/\u043e\u0431\u043b\u0430\u0441\u0442\u044c \u0440\u0438\u0441\u043e\u0432\u0430\u043d\u0438\u044f \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u0448\u0430\u0431\u043b\u043e\u043d\u0430                 Rect currentBlockRect = new Rect(currentBlockRenderLocation, currentRenderedBlock.RenderSize);                 \/\/\u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0435\u0433\u043e \u0432 \u0441\u043f\u0438\u0441\u043e\u043a (\u043f\u0440\u0438\u0433\u043e\u0434\u0438\u0442\u0441\u044f \u0434\u043b\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043a\u043b\u0438\u043a\u0430 \u043f\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443)                 this.CurrentVisibleListBlockRect.Add(currentBlockRect);                   \/\/\u043f\u043e\u0434\u043a\u0440\u0430\u0448\u0438\u0432\u0430\u0435\u043c \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442                 if (this.IndexCurrentChoosenBlock.Equals(tempIndex))                 {                     drawingContext.PushOpacity(0.5);                     drawingContext.DrawRectangle(this.ColorChoosenBlockShadow, null, currentBlockRect);                     drawingContext.Pop();                 }                   \/\/\u0432\u044b\u0431\u0438\u0440\u0430\u0435\u043c \u0441\u0430\u043c\u0443\u044e \u0434\u043b\u0438\u043d\u043d\u0443\u044e \u0448\u0438\u0440\u0438\u043d\u0443 (\u0441\u0430\u043c\u044b \u0434\u043b\u0438\u043d\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442) (\u0434\u043b\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0433\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0441\u043a\u0440\u043e\u043b\u043b\u0438\u043d\u0433\u0430)                 double deltaWidth = currentRenderedBlock.RenderSize.Width - currentWidth;                 if (deltaWidth &gt; 0)                     if (this.hScrollBar.Maximum &lt;= deltaWidth) { this.hScrollBar.Maximum = deltaWidth; }                   \/\/\u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u0432\u043d\u0438\u0437, \u043d\u0430 \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u043e\u0435 \u043c\u0435\u0441\u0442\u043e \u0434\u043b\u044f \u0440\u0438\u0441\u043e\u0432\u0430\u043d\u0438\u044f                 currentBlockRenderLocation.Y += currentRenderedBlock.RenderSize.Height;                 tempIndex++;             }         } <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  \u0414\u0430\u043b\u0435\u0435 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u00ab\u0440\u0430\u0441\u043a\u0440\u0430\u0441\u043a\u0438 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432\u00bb \u043d\u0430 \u0431\u0430\u0437\u0435 \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u0432. \u0421\u0440\u0430\u0437\u0443 \u0437\u0430\u0431\u0435\u0433\u0443 \u0432\u043f\u0435\u0440\u0451\u0434, \u0441\u043a\u0430\u0437\u0430\u0432, \u0447\u0442\u043e \u0442\u0430\u043a\u043e\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u0433\u043e \u0448\u0430\u0431\u043b\u043e\u043d\u0430, \u0442\u0430\u043a, \u043a\u0430\u043a \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e.<br \/>  \u0411\u0430\u0437\u043e\u0432\u044b\u0439 \u0448\u0430\u0431\u043b\u043e\u043d (BlockTemplateBase) \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d \u0432 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 5.<\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u041f\u0440\u0438\u043c\u0435\u0440 5<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code>    \/\/\/ &lt;summary&gt;     \/\/\/ \u0411\u0430\u0437\u043e\u0432\u044b\u0439 \u0448\u0430\u0431\u043b\u043e\u043d \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f     \/\/\/ &lt;\/summary&gt;     public class BlockTemplateBase     {         \/\/\/ &lt;summary&gt;         \/\/\/ \u041e\u0431\u043b\u0430\u0441\u0442\u044c \u0440\u0438\u0441\u043e\u0432\u0430\u043d\u0438\u044f         \/\/\/ &lt;\/summary&gt;         protected Rect RenderRect;         \/\/\/ &lt;summary&gt;         \/\/\/ \u0411\u0443\u0444\u0435\u0440 \u0440\u0438\u0441\u043e\u0432\u0430\u043d\u0438\u044f         \/\/\/ &lt;\/summary&gt;         protected DrawingVisual RenderBuffer;         \/\/\/ &lt;summary&gt;         \/\/\/ \u0420\u0430\u0437\u043c\u0435\u0440\u044b \u043e\u0431\u043b\u0430\u0441\u0442\u0438 \u0440\u0438\u0441\u043e\u0432\u0430\u043d\u0438\u044f         \/\/\/ &lt;\/summary&gt;         public Size RenderSize { get { return this.RenderRect.Size; } set { this.RenderRect.Size = value; } }           public BlockTemplateBase() { RenderRect = new Rect(); RenderSize = new Size(); RenderBuffer = new DrawingVisual(); }           \/\/\/ &lt;summary&gt;         \/\/\/ \u0411\u0430\u0437\u043e\u0432\u044b\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0440\u0435\u043d\u0434\u0435\u0440\u0438\u043d\u0433\u0430         \/\/\/ &lt;\/summary&gt;         \/\/\/ &lt;param name=&quot;renderLocation&quot;&gt; \u0442\u043e\u0447\u043a\u0430 \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u043a\u0438 &lt;\/param&gt;         \/\/\/ &lt;returns&gt; \u0431\u0443\u0444\u0435\u0440 \u0440\u0438\u0441\u043e\u0432\u0430\u043d\u0438\u044f &lt;\/returns&gt;         public DrawingVisual Render(Point renderLocation)         {             using (DrawingContext dc = RenderBuffer.RenderOpen())             {                 RenderRect.Location = renderLocation;                 dc.PushClip(new RectangleGeometry(RenderRect));                 \/\/\u0432\u044b\u0437\u044b\u0432\u0430\u0435\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043e\u043f\u0438\u0441\u0430\u043d \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0440\u0438\u043e\u0432\u0430\u043d\u0438\u044f                 if (DataRender != null) DataRender(dc);                 dc.Close();             }             return RenderBuffer;         }           protected delegate void DataRenderDelegate(DrawingContext dc);         \/\/\u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0441 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u043c \u0440\u0438\u0441\u043e\u0432\u0430\u043d\u0438\u044f         protected DataRenderDelegate DataRender { get; set; }     } <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  \u041f\u0440\u043e\u0441\u0442\u043e\u0439 \u0448\u0430\u0431\u043b\u043e\u043d (BlockTemplateSimple) \u0434\u043b\u044f \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f, \u043d\u0430\u0441\u043b\u0435\u0434\u0443\u0435\u043c\u044b\u0439 \u043e\u0442 \u0431\u0430\u0437\u043e\u0432\u043e\u0433\u043e \u0448\u0430\u0431\u043b\u043e\u043d\u0430 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d \u0432 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 6.  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u041f\u0440\u0438\u043c\u0435\u0440 6<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code>    \/\/\/ &lt;summary&gt;     \/\/\/ \u043f\u0440\u043e\u0441\u0442\u0435\u043d\u044c\u043a\u0438\u0439 \u0428\u0430\u0431\u043b\u043e\u043d \u0440\u0435\u043d\u0434\u0435\u0440\u0438\u043d\u0433\u0430     \/\/\/ &lt;\/summary&gt;     public class BlockTemplateSimple : BlockTemplateBase     {         \/\/\/ &lt;summary&gt;         \/\/\/ \u0422\u0435\u043a\u0441\u0442\u043e\u0432\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430         \/\/\/ &lt;\/summary&gt;         public string Data { get; set; }         \/\/\/ &lt;summary&gt;         \/\/\/ \u0426\u0432\u0435\u0442 \u0444\u043e\u043d\u0430         \/\/\/ &lt;\/summary&gt;         public Brush ColorBackground { get; set; }         \/\/\/ &lt;summary&gt;         \/\/\/ \u0426\u0432\u0435\u0442 \u0433\u0440\u0430\u043d\u0438\u0446         \/\/\/ &lt;\/summary&gt;         public Brush ColorBorder { get; set; }         \/\/\/ &lt;summary&gt;         \/\/\/ \u0426\u0432\u0435\u0442 \u0448\u0440\u0438\u0444\u0442\u0430         \/\/\/ &lt;\/summary&gt;         public Brush ColorFont { get; set; }         \/\/\/ &lt;summary&gt;         \/\/\/ \u0440\u0430\u0437\u043c\u0435\u0440 \u0448\u0440\u0438\u0444\u0442\u0430         \/\/\/ &lt;\/summary&gt;         public double FontSize { get; set; }         \/\/\/ &lt;summary&gt;         \/\/\/ \u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0448\u0440\u0438\u0444\u0442\u0430         \/\/\/ &lt;\/summary&gt;         public string FontName { get; set; }           public BlockTemplateSimple()         {             base.DataRender = this.DataRender;             ColorBackground = Brushes.WhiteSmoke;             ColorBorder = Brushes.Gray;             ColorFont = Brushes.Black;             FontSize = 10;             FontName = \u201cCalibri\u201d;         }           \/\/\/ &lt;summary&gt;         \/\/\/ \u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0440\u0435\u043d\u0434\u0435\u0440\u0438\u043d\u0433\u0430         \/\/\/ &lt;\/summary&gt;         \/\/\/ &lt;param name=\u201ddc\u201d&gt; \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u0440\u0438\u0441\u043e\u0432\u0430\u043d\u0438\u044f &lt;\/param&gt;         new void DataRender(DrawingContext dc)         {             \/\/\u0440\u0438\u0441\u0443\u0435\u043c \u0433\u0440\u0430\u043d\u0438\u0446\u0443             dc.DrawRectangle(ColorBackground, new Pen(ColorBorder, 1.0), this.RenderRect);             \/\/\u0444\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u0443\u0435\u043c \u0442\u0435\u043a\u0441\u0442 \u0434\u043b\u044f \u0440\u0438\u0441\u043e\u0432\u0430\u043d\u0438\u044f             FormattedText txt = new FormattedText(Data, CultureInfo.CurrentCulture, FlowDirection.LeftToRight, new Typeface(FontName), FontSize, ColorFont);             txt.MaxTextWidth = this.RenderRect.Width;;             txt.MaxTextHeight = this.RenderRect.Height;             txt.TextAlignment = TextAlignment.Justify;             \/\/\u0440\u0438\u0441\u0443\u0435\u043c \u0442\u0435\u043a\u0441\u0442             dc.DrawText(txt, this.RenderRect.Location);         }     } <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u044b\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u043e\u0433\u043e \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430. <br \/>  \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u043c 2 \u0442\u0435\u0441\u0442\u043e\u0432\u044b\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0445 \u043a\u043b\u0430\u0441\u0441\u0430, \u043a\u0430\u043a \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043e \u0432 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 7.  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u041f\u0440\u0438\u043c\u0435\u0440 7<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code>    public class UserClassA     {         public int Value { get; set; }         public string Str1 { get; set; }         public string Str2 { get; set; }         public UserClassA()         { Value = 0; Str1 = &quot;__&quot;; Str2 = &quot;__&quot;; }         public UserClassA(int val, string str1, string str2):this()         { Value = val; Str1 = str1; Str2 = str2; }     }     public class UserClassB     {         public string Str { get; set; }         public UserClassB()         { Str = &quot;__&quot;; }         public UserClassB(string str) : this()         { Str = str; }     } <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  \u0412 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 8 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u043c \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442. \u0412 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 9 \u2013 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0438\u0437 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u0433\u043e \u0442\u0438\u043f\u0430 \u0432 \u0448\u0430\u0431\u043b\u043e\u043d.  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u041f\u0440\u0438\u043c\u0435\u0440 8<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code>        List&lt;object&gt; DataList { get; set; }         Random r { get; set; }           public MainWindow()         {             InitializeComponent();             DataList = new List&lt;object&gt;();             r = new Random();             this.listBlockView_Test.ConvertToBlockTemplate = this.ConvertToBlockTemplate;             this.listBlockView_Test.ClickItem += new EventHandler&lt;ListBlockView.ListBlockView.ClickDataItemEventArgs&gt;(listBlockView_Test_ClickItem);         } <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u041f\u0440\u0438\u043c\u0435\u0440 9<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code>        \/\/\/ &lt;summary&gt;         \/\/\/ \u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0439 \u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0438\u0437 \u0441\u043e\u0432\u0435\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430 \u0432 \u0448\u0430\u0431\u043b\u043e\u043d \u0440\u0438\u0441\u043e\u0432\u0430\u043d\u0438\u044f         \/\/\/ &lt;\/summary&gt;         \/\/\/ &lt;param name=&quot;item&quot;&gt;\u044d\u043b\u0435\u043c\u0435\u043d\u0442&lt;\/param&gt;         \/\/\/ &lt;param name=&quot;index&quot;&gt;\u0438\u043d\u0434\u0435\u043a\u0441&lt;\/param&gt;         \/\/\/ &lt;returns&gt;\u0448\u0430\u0431\u043b\u043e\u043d&lt;\/returns&gt;         BlockTemplateBase ConvertToBlockTemplate(object item, int index)         {             BlockTemplateSimple block = new BlockTemplateSimple();             if (item is UserClassA)             {                 UserClassA itemA = (UserClassA)item;                 \/\/\u0424\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u043c \u0434\u0430\u043d\u043d\u044b\u0435 \u0434\u043b\u044f \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f                 block.Data = String.Format(&quot;Value= {0}, Str1= {1}, Str2= {2}&quot;, itemA.Value.ToString(), itemA.Str1, itemA.Str2);                  \/\/\u0420\u0430\u0441\u043a\u0440\u0430\u0448\u0438\u0432\u0430\u0435\u043c (\u0437\u0430\u0434\u0430\u0451\u043c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0440\u0438\u0441\u043e\u0432\u0430\u043d\u0438\u044f)                 block.FontSize = 14;                 block.FontName = &quot;Calibri&quot;;                 block.ColorBackground = Brushes.Yellow;                 block.ColorBorder = Brushes.Red;                 block.ColorFont = Brushes.Blue;             }             else if (item is UserClassB)             {                 UserClassB itemB = (UserClassB)item;                 \/\/\u0424\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u043c \u0434\u0430\u043d\u043d\u044b\u0435 \u0434\u043b\u044f \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f                 block.Data = String.Format(&quot;Str= {0}&quot;, itemB.Str);                 \/\/\u0420\u0430\u0441\u043a\u0440\u0430\u0448\u0438\u0432\u0430\u0435\u043c (\u0437\u0430\u0434\u0430\u0451\u043c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0440\u0438\u0441\u043e\u0432\u0430\u043d\u0438\u044f)                 block.FontSize = 12;                 block.FontName = &quot;Courier New&quot;;                 block.ColorBackground = Brushes.LightGray;                 block.ColorBorder = Brushes.Black;                 block.ColorFont = Brushes.Green;             }             block.RenderSize = new Size(500, 30);             return block;         } <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  \u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043a\u043b\u0438\u043a\u0430 \u043f\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u0430 \u0432 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 10.  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u041f\u0440\u0438\u043c\u0435\u0440 10<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code>        void listBlockView_Test_ClickItem(object sender, ListBlockView.ClickDataItemEventArgs e)         {             string textBoxStr = &quot;&quot;;             if (e.Item is UserClassA)             {                 textBoxStr = String.Format(&quot;\u0418\u043d\u0434\u0435\u043a\u0441 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 = {0}{1}\u0422\u0438\u043f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430: {2}{3}Value= {4}, Str1= {5}, Str2= {6}&quot;,                     e.Index.ToString(), '\\n'.ToString(),                      &quot;UserClassA&quot;, '\\n'.ToString(),                     ((UserClassA)e.Item).Value.ToString(), ((UserClassA)e.Item).Str1, ((UserClassA)e.Item).Str2);             }             else if (e.Item is UserClassB)             {                 textBoxStr = String.Format(&quot;\u0418\u043d\u0434\u0435\u043a\u0441 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 = {0}{1}\u0422\u0438\u043f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430: {2}{3}Str= {4}&quot;,                      e.Index.ToString(), '\\n'.ToString(),                     &quot;UserClassB&quot;, '\\n'.ToString(),                     ((UserClassB)e.Item).Str);             }             MessageBox.Show(textBoxStr);         } <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  <\/p>\n<h1>\u0412\u044b\u0432\u043e\u0434\u044b<\/h1>\n<p>  \u041c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0435\u0449\u0451 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0437\u0430\u0434\u0430\u043d\u0438\u0435 \u043e\u0431\u0449\u0435\u0433\u043e \u0432\u0438\u0434\u0430 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430 \u0432 xaml-\u043a\u043e\u0434\u0435 \u0438 \u043c\u043d\u043e\u0433\u043e \u0434\u0440\u0443\u0433\u0438\u0445 \u043f\u043b\u044e\u0448\u0435\u043a \u2013 \u0438\u0445 \u0432 WPF \u043c\u043d\u043e\u0433\u043e, \u043d\u043e \u043d\u0435 \u0431\u0443\u0434\u0435\u043c \u0437\u0430\u0431\u044b\u0432\u0430\u0442\u044c, \u0447\u0442\u043e \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u043d\u0443\u0436\u0435\u043d \u0431\u044b\u043b \u00ab\u0435\u0449\u0451 \u0432\u0447\u0435\u0440\u0430\u00bb \u0438 \u00ab\u043f\u043e-\u0431\u044b\u0441\u0442\u0440\u043e\u043c\u0443\u00bb.<br \/>  \u0418\u0442\u0430\u043a, \u043d\u0430 \u0432\u044b\u0445\u043e\u0434\u0435 \u0438\u043c\u0435\u0435\u043c:  <\/p>\n<ul>\n<li>\u041a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u0442\u0438\u043f\u0430 ListView \u0441 \u043d\u0435\u043e\u0434\u043d\u043e\u0440\u043e\u0434\u043d\u044b\u043c \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u044b\u043c;<\/li>\n<li>\u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c\u044e \u0437\u0430\u0434\u0430\u043d\u0438\u044f \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 \u0440\u0435\u043d\u0434\u0435\u0440\u0438\u043d\u0433\u0430 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 (\u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u0433\u043e \u0442\u0438\u043f\u0430 \u0432 \u0448\u0430\u0431\u043b\u043e\u043d \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f);<\/li>\n<li>\u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0448\u0430\u0431\u043b\u043e\u043d\u0430 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u00ab\u043f\u043e \u043f\u043e\u0442\u0440\u0435\u0431\u043d\u043e\u0441\u0442\u044f\u043c\u00bb \u0441\u0430\u043c\u0438\u043c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u043c \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430 \u043f\u043e \u043d\u0435\u0441\u043b\u043e\u0436\u043d\u044b\u043c \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0430\u043c (\u0442.\u0435. \u043d\u0435 \u043e\u0441\u043e\u0431\u043e \u0441\u043b\u043e\u0436\u043d\u043e \u0438 \u0441\u0430\u043c\u043e\u043c\u0443 \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u2013 \u043d\u0438\u043a\u0430\u043a\u0438\u0445 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0439);<\/li>\n<li>\u0412\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0439 \u0440\u0435\u0436\u0438\u043c \u0440\u0430\u0431\u043e\u0442\u044b \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430 (\u0442.\u0435. \u0432\u044b\u0432\u043e\u0434 (\u0440\u0435\u043d\u0434\u0435\u0440\u0438\u043d\u0433) \u0438\u0434\u0451\u0442 \u00ab\u043d\u0430 \u043b\u0435\u0442\u0443\u00bb) \u2013 \u044d\u0442\u043e \u0443\u0441\u043a\u043e\u0440\u044f\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0443 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430 (\u043d\u0430\u043c \u043d\u0435 \u043d\u0430\u0434\u043e \u043d\u0438\u0447\u0435\u0433\u043e \u0441 \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u0434\u0435\u043b\u0430\u0442\u044c, \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u0430\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430);<\/li>\n<li>\u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0431\u044b\u0441\u0442\u0440\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u044b \u043d\u0430 \u043b\u044e\u0431\u043e\u043c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0435 \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 (\u0441\u0442\u043e\u043b\u044c\u043a\u043e, \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0432\u043c\u0435\u0449\u0430\u0435\u0442\u0441\u044f \u0432 List).<\/li>\n<\/ul>\n<p>  <\/p>\n<h1>P.S.<\/h1>\n<p>  \u041f\u0440\u043e\u0448\u0443 \u043f\u043e\u0434\u043a\u0438\u043d\u0443\u0442\u044c \u0443\u043c\u043d\u044b\u0445 \u043c\u044b\u0441\u043b\u0435\u0439 \u043f\u043e \u0443\u043b\u0443\u0447\u0448\u0435\u043d\u0438\u044e \u0432 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u044f\u0445.<br \/>  \u0421\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043f\u0440\u043e\u0435\u043a\u0442: <a href=\"https:\/\/cloud.mail.ru\/public\/D3tr\/mXDrP7HoM\">\u0421\u043a\u0430\u0447\u0430\u0442\u044c \u043f\u0440\u043e\u0435\u043a\u0442<\/a><br \/>  \u041f\u0440\u0438\u043c\u0435\u0447\u0430\u043d\u0438\u0435: \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0432\u0435\u043b\u0430\u0441\u044c \u0432 MS Visual Studio 2010 \u043f\u043e\u0434 \u00ab.Net Framework 4\u00bb               <\/p>\n<div class=\"clear\"><\/div>\n<p> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"http:\/\/habrahabr.ru\/post\/272595\/\"> http:\/\/habrahabr.ru\/post\/272595\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<br \/>\n<h1>\u0412\u0432\u0435\u0434\u0435\u043d\u0438\u0435<\/h1>\n<p>  \u041f\u0440\u0438\u0437\u043d\u0430\u0435\u043c \u0432\u0441\u0435, \u0447\u0442\u043e \u00abDotNetFramework\u00bb \u2014 \u0433\u0435\u043d\u0438\u0430\u043b\u044c\u043d\u043e\u0435 \u0438\u0437\u043e\u0431\u0440\u0435\u0442\u0435\u043d\u0438\u0435 Microsoft, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0432\u043d\u0443\u0448\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043d\u0430\u0431\u043e\u0440 \u0433\u043e\u0442\u043e\u0432\u044b\u0445 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432 \u0438 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0441\u0442\u0440\u043e\u0438\u0442\u044c \u041f\u041e \u043f\u043e \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0443 \u00abLEGO\u00bb. \u041d\u043e \u043d\u0435 \u0432\u0441\u0435\u0433\u0434\u0430 \u0438\u0445 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e, \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u0434\u043b\u044f \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0437\u0430\u0434\u0430\u0447, \u0442\u0440\u0435\u0431\u0443\u044e\u0449\u0438\u0445 \u043b\u0438\u0431\u043e \u00ab\u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0433\u043e \u0431\u044b\u0441\u0442\u0440\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f\u00bb, \u043b\u0438\u0431\u043e \u00ab\u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0433\u043e \u0441\u043f\u043e\u0441\u043e\u0431\u0430 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f\u00bb\u2026 \u0418 Microsoft \u0434\u0430\u0451\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0441\u0432\u043e\u0438 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b. \u0418\u0442\u0430\u043a, \u0445\u043e\u0447\u0443 \u043f\u043e\u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f \u043e\u043f\u044b\u0442\u043e\u043c \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0433\u043e ListView-\u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430 (\u0431\u0443\u0434\u0435\u043c \u043d\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u0442\u0430\u043a \u0432\u0438\u0434 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0432\u044b\u0432\u043e\u0434\u044f\u0442 \u0434\u043b\u044f \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0430 \u0441\u043f\u0438\u0441\u043e\u043a \u043a\u0430\u043a\u0438\u0445-\u043b\u0438\u0431\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432) \u2014 \u00ab\u043f\u043e-\u0431\u044b\u0441\u0442\u0440\u043e\u043c\u0443\u00bb (\u0432 \u0443\u0441\u043b\u043e\u0432\u0438\u044f\u0445, \u043a\u043e\u0433\u0434\u0430 \u043d\u0430\u0434\u043e \u0431\u044b\u043b\u043e \u0435\u0449\u0451 \u0432\u0447\u0435\u0440\u0430).  <\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-269813","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/269813","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=269813"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/269813\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=269813"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=269813"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=269813"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}