<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://dev.net.ua/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Dmitry Peleshenko</title><link>http://dev.net.ua/blogs/dmitrypeleshenko/default.aspx</link><description /><dc:language /><generator>CommunityServer 2.1 (Build: 60809.935)</generator><item><title>Презентация из моего доклада о TFS 2010 и новых инструментах для тестирования 18.02.2010 в ХИРЭ</title><link>http://dev.net.ua/blogs/dmitrypeleshenko/archive/2010/02/27/9400.aspx</link><pubDate>Fri, 26 Feb 2010 23:44:00 GMT</pubDate><guid isPermaLink="false">434e5f47-9beb-46b7-aee2-adf5f643f7c6:9400</guid><dc:creator>Dmitry Peleshenko</dc:creator><slash:comments>0</slash:comments><comments>http://dev.net.ua/blogs/dmitrypeleshenko/comments/9400.aspx</comments><wfw:commentRss>http://dev.net.ua/blogs/dmitrypeleshenko/commentrss.aspx?PostID=9400</wfw:commentRss><description>Презентация из моего доклада о TFS 2010 и новых инструментах для тестирования 18.02.2010 в ХИРЭ&lt;img src="http://dev.net.ua/aggbug.aspx?PostID=9400" width="1" height="1"&gt;</description><enclosure url="http://dev.net.ua/blogs/dmitrypeleshenko/attachment/9400.ashx" length="4847147" type="application/zip" /><category domain="http://dev.net.ua/blogs/dmitrypeleshenko/archive/tags/Visual+Studio+2010/default.aspx">Visual Studio 2010</category><category domain="http://dev.net.ua/blogs/dmitrypeleshenko/archive/tags/Test+_2600_amp_3B00_+Lab+Manager/default.aspx">Test &amp;amp; Lab Manager</category><category domain="http://dev.net.ua/blogs/dmitrypeleshenko/archive/tags/TFS+2010/default.aspx">TFS 2010</category></item><item><title>WPF: Деревья и колонки</title><link>http://dev.net.ua/blogs/dmitrypeleshenko/archive/2009/11/24/9045.aspx</link><pubDate>Mon, 23 Nov 2009 22:04:00 GMT</pubDate><guid isPermaLink="false">434e5f47-9beb-46b7-aee2-adf5f643f7c6:9045</guid><dc:creator>Dmitry Peleshenko</dc:creator><slash:comments>5</slash:comments><comments>http://dev.net.ua/blogs/dmitrypeleshenko/comments/9045.aspx</comments><wfw:commentRss>http://dev.net.ua/blogs/dmitrypeleshenko/commentrss.aspx?PostID=9045</wfw:commentRss><description>&lt;p&gt;Одним из часто используемых элементов управления является дерево, оснащенное дополнительными колонками для детального представления элементов.  &lt;p&gt;&lt;a href="http://dev.net.ua/blogs/dmitrypeleshenko/clip_image002_766CCF8B.jpg"&gt;&lt;img style="border-right-width:0px;display:block;float:none;border-top-width:0px;border-bottom-width:0px;margin-left:auto;border-left-width:0px;margin-right:auto;" title="clip_image002" border="0" alt="clip_image002" src="http://dev.net.ua/blogs/dmitrypeleshenko/clip_image002_thumb_2D66ADC5.jpg" width="464" height="170"&gt;&lt;/a&gt;  &lt;p&gt;Библиотека WPF, на первый взгляд, не содержит такого элемента. ;-)  &lt;p&gt;Но существует несколько сторонних разработок, позволяющих добиться такого эффекта.  &lt;ol&gt; &lt;li&gt; &lt;div align="justify"&gt;1. Telerik RadTreeListView. Элемент управления. созданный компанией Telerik, не имеющий ничего общего с System.Windows.Controls.TreeView и напрямую наследующий System.Windows.Controls.ItemsControl. Прямо из коробки этот элемент не содержит колонок. Но после небольшой доработки, предложенной автором(&lt;a href="http://www.telerik.com/community/forums/wpf/treeview/multicolumn-treeview.aspx"&gt;http://www.telerik.com/community/forums/wpf/treeview/multicolumn-treeview.aspx&lt;/a&gt;) этот элемент превращается в довольно симпатичное дерево с колонками. Колонки задаются довольно просто.&lt;br&gt;&lt;/div&gt; &lt;li&gt; &lt;div align="justify"&gt;CodeProject: TreeListView (&lt;a href="http://www.codeproject.com/KB/WPF/TreeListView.aspx"&gt;http://www.codeproject.com/KB/WPF/TreeListView.aspx&lt;/a&gt;) Это основанный на System.Windows.Controls.TreeView элемент управления который содержит несколько десятков строк кода на С#, вместе с замысловатым в котором вычисляют насколько необходимо сдвинуть строку от левого края в зависимости от уровня элемента дерева. Через этот конвертор затем выполняют привязку ширины фиктивного элемента осуществляющего сдвиг. Кроме того элемент переопределяет почти все шаблоны из TreeView. Неплохой вариант, поддерживает даже изменения порядка колонок, но слишком уж сложно все организовано.&lt;br&gt;&lt;/div&gt; &lt;li&gt; &lt;div align="justify"&gt;Mindscape MulticolumnTreeView (&lt;a href="http://www.mindscape.co.nz/"&gt;http://www.mindscape.co.nz/&lt;/a&gt;) Показывает колонки прямо из коробки, никаких доработок не требует. Но опять-таки стоит денег. &lt;/div&gt;&lt;/li&gt;&lt;/ol&gt; &lt;p align="justify"&gt;Тут я предлагаю вспомнить о том, что элементы управления в WPF не имеют жестко заданного внешнего вид, а имеют только поведение и дерево это нечто, что содержит иерархию элементов, а как выглядеть этим элементам решать разработчику. Для того, чтобы добавить колонки в обычное дерево мы переопределим его ItemTemplate: &lt;/p&gt; &lt;p style="margin:0px;font-family:courier new;background:white;color:black;font-size:10pt;"&gt;&lt;span style="color:blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;TreeView.ItemTemplate&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin:0px;font-family:courier new;background:white;color:black;font-size:10pt;"&gt;&lt;span style="color:#a31515;"&gt;&amp;nbsp; &lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;HierarchicalDataTemplate&lt;/span&gt;&lt;span style="color:red;"&gt; ItemsSource&lt;/span&gt;&lt;span style="color:blue;"&gt;="{&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Binding&lt;/span&gt;&lt;span style="color:red;"&gt; Path&lt;/span&gt;&lt;span style="color:blue;"&gt;=Children}"&amp;gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin:0px;font-family:courier new;background:white;color:black;font-size:10pt;"&gt;&lt;span style="color:#a31515;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Grid&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin:0px;font-family:courier new;background:white;color:black;font-size:10pt;"&gt;&lt;span style="color:#a31515;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Grid.Resources&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin:0px;font-family:courier new;background:white;color:black;font-size:10pt;"&gt;&lt;span style="color:#a31515;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Style&lt;/span&gt;&lt;span style="color:red;"&gt; TargetType&lt;/span&gt;&lt;span style="color:blue;"&gt;="TextBlock"&amp;gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin:0px;font-family:courier new;background:white;color:black;font-size:10pt;"&gt;&lt;span style="color:#a31515;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Setter&lt;/span&gt;&lt;span style="color:red;"&gt; Property&lt;/span&gt;&lt;span style="color:blue;"&gt;="Margin"&lt;/span&gt;&lt;span style="color:red;"&gt; Value&lt;/span&gt;&lt;span style="color:blue;"&gt;="1"/&amp;gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin:0px;font-family:courier new;background:white;color:black;font-size:10pt;"&gt;&lt;span style="color:#a31515;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Style&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin:0px;font-family:courier new;background:white;color:black;font-size:10pt;"&gt;&lt;span style="color:#a31515;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Grid.Resources&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin:0px;font-family:courier new;background:white;color:black;font-size:10pt;"&gt;&lt;span style="color:#a31515;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Grid.ColumnDefinitions&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin:0px;font-family:courier new;background:white;color:black;font-size:10pt;"&gt;&lt;span style="color:#a31515;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;ColumnDefinition&lt;/span&gt;&lt;span style="color:red;"&gt; Width&lt;/span&gt;&lt;span style="color:blue;"&gt;="*"/&amp;gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin:0px;font-family:courier new;background:white;color:black;font-size:10pt;"&gt;&lt;span style="color:#a31515;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;ColumnDefinition&lt;/span&gt;&lt;span style="color:red;"&gt; Width&lt;/span&gt;&lt;span style="color:blue;"&gt;="Auto"/&amp;gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin:0px;font-family:courier new;background:white;color:black;font-size:10pt;"&gt;&lt;span style="color:#a31515;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;ColumnDefinition&lt;/span&gt;&lt;span style="color:red;"&gt; Width&lt;/span&gt;&lt;span style="color:blue;"&gt;="Auto"/&amp;gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin:0px;font-family:courier new;background:white;color:black;font-size:10pt;"&gt;&lt;span style="color:#a31515;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;ColumnDefinition&lt;/span&gt;&lt;span style="color:red;"&gt; Width&lt;/span&gt;&lt;span style="color:blue;"&gt;="Auto"/&amp;gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin:0px;font-family:courier new;background:white;color:black;font-size:10pt;"&gt;&lt;span style="color:#a31515;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Grid.ColumnDefinitions&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin:0px;font-family:courier new;background:white;color:black;font-size:10pt;"&gt;&lt;span style="color:#a31515;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;TextBlock&lt;/span&gt;&lt;span style="color:red;"&gt; Text&lt;/span&gt;&lt;span style="color:blue;"&gt;="{&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Binding&lt;/span&gt;&lt;span style="color:red;"&gt; Path&lt;/span&gt;&lt;span style="color:blue;"&gt;=Title}"&lt;/span&gt;&lt;span style="color:red;"&gt; Grid.Column&lt;/span&gt;&lt;span style="color:blue;"&gt;="0" /&amp;gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin:0px;font-family:courier new;background:white;color:black;font-size:10pt;"&gt;&lt;span style="color:#a31515;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;TextBlock&lt;/span&gt;&lt;span style="color:red;"&gt; Text&lt;/span&gt;&lt;span style="color:blue;"&gt;="{&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Binding&lt;/span&gt;&lt;span style="color:red;"&gt; Path&lt;/span&gt;&lt;span style="color:blue;"&gt;=DateTime}"&lt;/span&gt;&lt;span style="color:red;"&gt; Grid.Column&lt;/span&gt;&lt;span style="color:blue;"&gt;="1"&lt;/span&gt;&lt;/p&gt; &lt;p style="margin:0px;font-family:courier new;background:white;color:black;font-size:10pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:red;"&gt;Width&lt;/span&gt;&lt;span style="color:blue;"&gt;="{&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Binding&lt;/span&gt;&lt;span style="color:red;"&gt; ElementName&lt;/span&gt;&lt;span style="color:blue;"&gt;=DateTimeHeader,&lt;/span&gt;&lt;span style="color:red;"&gt; Path&lt;/span&gt;&lt;span style="color:blue;"&gt;=ActualWidth}"/&amp;gt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt; &lt;/span&gt;&lt;/p&gt; &lt;p style="margin:0px;font-family:courier new;background:white;color:black;font-size:10pt;"&gt;&lt;span style="color:#a31515;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;TextBlock&lt;/span&gt;&lt;span style="color:red;"&gt; Text&lt;/span&gt;&lt;span style="color:blue;"&gt;="{&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Binding&lt;/span&gt;&lt;span style="color:red;"&gt; Path&lt;/span&gt;&lt;span style="color:blue;"&gt;=Raiting}"&lt;/span&gt;&lt;span style="color:red;"&gt; Grid.Column&lt;/span&gt;&lt;span style="color:blue;"&gt;="2"&lt;/span&gt;&lt;/p&gt; &lt;p style="margin:0px;font-family:courier new;background:white;color:black;font-size:10pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:red;"&gt;Width&lt;/span&gt;&lt;span style="color:blue;"&gt;="{&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Binding&lt;/span&gt;&lt;span style="color:red;"&gt; ElementName&lt;/span&gt;&lt;span style="color:blue;"&gt;=RaitingHeader,&lt;/span&gt;&lt;span style="color:red;"&gt; Path&lt;/span&gt;&lt;span style="color:blue;"&gt;=ActualWidth}"/&amp;gt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt; &lt;/span&gt;&lt;/p&gt; &lt;p style="margin:0px;font-family:courier new;background:white;color:black;font-size:10pt;"&gt;&lt;span style="color:#a31515;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Rectangle&lt;/span&gt;&lt;span style="color:red;"&gt; Width&lt;/span&gt;&lt;span style="color:blue;"&gt;="{&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Binding&lt;/span&gt;&lt;span style="color:red;"&gt; ElementName&lt;/span&gt;&lt;span style="color:blue;"&gt;=EmptyHeader,&lt;/span&gt;&lt;span style="color:red;"&gt; Path&lt;/span&gt;&lt;span style="color:blue;"&gt;=ActualWidth}"&lt;/span&gt;&lt;span style="color:red;"&gt; Grid.Column&lt;/span&gt;&lt;span style="color:blue;"&gt;="3" /&amp;gt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt; &lt;/span&gt;&lt;/p&gt; &lt;p style="margin:0px;font-family:courier new;background:white;color:black;font-size:10pt;"&gt;&lt;span style="color:#a31515;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Grid&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin:0px;font-family:courier new;background:white;color:black;font-size:10pt;"&gt;&lt;span style="color:#a31515;"&gt;&amp;nbsp; &lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;HierarchicalDataTemplate&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin:0px;font-family:courier new;background:white;color:black;font-size:10pt;"&gt;&lt;span style="color:blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;TreeView.ItemTemplate&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt; &lt;p&gt;Затем добавим заголовок, чтобы отображать названия колонок и изменять их размер. &lt;/p&gt; &lt;div style="font-family:courier new;background:white;color:black;font-size:10pt;"&gt; &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Control.Template&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin:0px;"&gt;&lt;span style="color:#a31515;"&gt;&amp;nbsp; &lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;ControlTemplate&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin:0px;"&gt;&lt;span style="color:#a31515;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;StackPanel&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin:0px;"&gt;&lt;span style="color:#a31515;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Grid&lt;/span&gt;&lt;span style="color:red;"&gt; x&lt;/span&gt;&lt;span style="color:blue;"&gt;:&lt;/span&gt;&lt;span style="color:red;"&gt;Name&lt;/span&gt;&lt;span style="color:blue;"&gt;="HeaderGrid"&amp;gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin:0px;"&gt;&lt;span style="color:#a31515;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Grid.Resources&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin:0px;"&gt;&lt;span style="color:#a31515;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Style&lt;/span&gt;&lt;span style="color:red;"&gt; TargetType&lt;/span&gt;&lt;span style="color:blue;"&gt;="GridViewColumnHeader"&amp;gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin:0px;"&gt;&lt;span style="color:#a31515;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Setter&lt;/span&gt;&lt;span style="color:red;"&gt; Property&lt;/span&gt;&lt;span style="color:blue;"&gt;="Margin"&lt;/span&gt;&lt;span style="color:red;"&gt; Value&lt;/span&gt;&lt;span style="color:blue;"&gt;="1"/&amp;gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin:0px;"&gt;&lt;span style="color:#a31515;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Style&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin:0px;"&gt;&lt;span style="color:#a31515;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Grid.Resources&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin:0px;"&gt;&lt;span style="color:#a31515;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Grid.ColumnDefinitions&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin:0px;"&gt;&lt;span style="color:#a31515;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;ColumnDefinition&lt;/span&gt;&lt;span style="color:red;"&gt; Width&lt;/span&gt;&lt;span style="color:blue;"&gt;="Auto"/&amp;gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin:0px;"&gt;&lt;span style="color:#a31515;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;ColumnDefinition&lt;/span&gt;&lt;span style="color:red;"&gt; Width&lt;/span&gt;&lt;span style="color:blue;"&gt;="Auto"/&amp;gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin:0px;"&gt;&lt;span style="color:#a31515;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;ColumnDefinition&lt;/span&gt;&lt;span style="color:red;"&gt; Width&lt;/span&gt;&lt;span style="color:blue;"&gt;="Auto"/&amp;gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin:0px;"&gt;&lt;span style="color:#a31515;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;ColumnDefinition&lt;/span&gt;&lt;span style="color:red;"&gt; Width&lt;/span&gt;&lt;span style="color:blue;"&gt;="*" /&amp;gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin:0px;"&gt;&lt;span style="color:#a31515;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Grid.ColumnDefinitions&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin:0px;"&gt;&lt;span style="color:#a31515;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;GridViewColumnHeader&lt;/span&gt;&lt;span style="color:red;"&gt; Content&lt;/span&gt;&lt;span style="color:blue;"&gt;="Title"&lt;/span&gt;&amp;nbsp;&amp;nbsp; &lt;span style="color:red;"&gt;Grid.Column&lt;/span&gt;&lt;span style="color:blue;"&gt;="0"&lt;/span&gt;&lt;span style="color:red;"&gt; x&lt;/span&gt;&lt;span style="color:blue;"&gt;:&lt;/span&gt;&lt;span style="color:red;"&gt;Name&lt;/span&gt;&lt;span style="color:blue;"&gt;="TitleHeader"&lt;/span&gt; &lt;span style="color:red;"&gt;Width&lt;/span&gt;&lt;span style="color:blue;"&gt;="220" /&amp;gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin:0px;"&gt;&lt;span style="color:#a31515;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;GridViewColumnHeader&lt;/span&gt;&lt;span style="color:red;"&gt; Content&lt;/span&gt;&lt;span style="color:blue;"&gt;="Date/Time"&lt;/span&gt;&lt;span style="color:red;"&gt; Grid.Column&lt;/span&gt;&lt;span style="color:blue;"&gt;="1"&lt;/span&gt;&lt;span style="color:red;"&gt; x&lt;/span&gt;&lt;span style="color:blue;"&gt;:&lt;/span&gt;&lt;span style="color:red;"&gt;Name&lt;/span&gt;&lt;span style="color:blue;"&gt;="DateTimeHeader" /&amp;gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin:0px;"&gt;&lt;span style="color:#a31515;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;GridViewColumnHeader&lt;/span&gt;&lt;span style="color:red;"&gt; Content&lt;/span&gt;&lt;span style="color:blue;"&gt;="Raiting"&lt;/span&gt; &lt;span style="color:red;"&gt;Grid.Column&lt;/span&gt;&lt;span style="color:blue;"&gt;="2"&lt;/span&gt;&lt;span style="color:red;"&gt; x&lt;/span&gt;&lt;span style="color:blue;"&gt;:&lt;/span&gt;&lt;span style="color:red;"&gt;Name&lt;/span&gt;&lt;span style="color:blue;"&gt;="RaitingHeader" /&amp;gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin:0px;"&gt;&lt;span style="color:#a31515;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Rectangle&lt;/span&gt;&lt;span style="color:red;"&gt; Grid.Column&lt;/span&gt;&lt;span style="color:blue;"&gt;="3"&lt;/span&gt;&lt;span style="color:red;"&gt; x&lt;/span&gt;&lt;span style="color:blue;"&gt;:&lt;/span&gt;&lt;span style="color:red;"&gt;Name&lt;/span&gt;&lt;span style="color:blue;"&gt;="EmptyHeader"&lt;/span&gt; &lt;span style="color:blue;"&gt;/&amp;gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin:0px;"&gt;&lt;span style="color:#a31515;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Grid&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin:0px;"&gt;&lt;span style="color:#a31515;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;ItemsPresenter&lt;/span&gt;&lt;span style="color:red;"&gt; Width&lt;/span&gt;&lt;span style="color:blue;"&gt;="{&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Binding&lt;/span&gt;&lt;span style="color:red;"&gt; ElementName&lt;/span&gt;&lt;span style="color:blue;"&gt;=HeaderGrid,&lt;/span&gt;&lt;span style="color:red;"&gt; Path&lt;/span&gt;&lt;span style="color:blue;"&gt;=ActualWidth}" /&amp;gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin:0px;"&gt;&lt;span style="color:#a31515;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;StackPanel&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin:0px;"&gt;&lt;span style="color:#a31515;"&gt;&amp;nbsp; &lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;ControlTemplate&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Control.Template&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;/div&gt; &lt;p align="justify"&gt;В этом коде на XAML есть одна небольшая хитрость: в заголовке последняя колонка элемента &lt;font size="2" face="Courier New"&gt;Grid&lt;/font&gt; заполняет все оставшееся место, а в шаблоне элемента дерева первая (ведь у каждого элемента она разная, т.к. элементы разных уровней по-разному отодвинуты от левого края). Кроме того добавлен прямоугольник заполняющий свободную область справа и выполнены соответствующие привязки ширины элементов и данных в элементах &lt;font size="2" face="Courier New"&gt;TextBlock&lt;/font&gt;. На этом казалось бы можно остановится, но шаблон элемента &lt;font size="2" face="Courier New"&gt;TreeViewItem&lt;/font&gt; из которого строится дерево не растягивает свое содержимое на все доступное пространство. Поэтому его придется переопределить. Возьмем его стандартный шаблон и изменим его всего в двух местах.  &lt;p&gt;В единственном элементе &lt;font size="2" face="Courier New"&gt;Grid&lt;/font&gt; вместо  &lt;div style="font-family:courier new;background:white;color:black;font-size:10pt;"&gt; &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Grid.ColumnDefinitions&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin:0px;"&gt;&lt;span style="color:#a31515;"&gt;&amp;nbsp; &lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;ColumnDefinition&lt;/span&gt;&lt;span style="color:red;"&gt; Width&lt;/span&gt;&lt;span style="color:blue;"&gt;="Auto" /&amp;gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin:0px;"&gt;&lt;span style="color:#a31515;"&gt;&amp;nbsp; &lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;ColumnDefinition&lt;/span&gt;&lt;span style="color:red;"&gt; Width&lt;/span&gt;&lt;span style="color:blue;"&gt;="Auto" /&amp;gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin:0px;"&gt;&lt;span style="color:#a31515;"&gt;&amp;nbsp; &lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;ColumnDefinition&lt;/span&gt;&lt;span style="color:red;"&gt; Width&lt;/span&gt;&lt;span style="color:blue;"&gt;="*" /&amp;gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Grid.ColumnDefinitions&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;/div&gt; &lt;p&gt;оставляем только две колонки  &lt;div style="font-family:courier new;background:white;color:black;font-size:10pt;"&gt; &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Grid.ColumnDefinitions&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin:0px;"&gt;&lt;span style="color:#a31515;"&gt;&amp;nbsp; &lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;ColumnDefinition&lt;/span&gt;&lt;span style="color:red;"&gt; Width&lt;/span&gt;&lt;span style="color:blue;"&gt;="Auto" /&amp;gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin:0px;"&gt;&lt;span style="color:#a31515;"&gt;&amp;nbsp; &lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;ColumnDefinition&lt;/span&gt;&lt;span style="color:red;"&gt; Width&lt;/span&gt;&lt;span style="color:blue;"&gt;="*" /&amp;gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Grid.ColumnDefinitions&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;/div&gt; &lt;p align="justify"&gt;И в элементе &lt;font size="2" face="Courier New"&gt;ContentPresenter&lt;/font&gt; устанавливаем &lt;font size="2" face="Courier New"&gt;HorizontalAlignment="Stretch"&lt;/font&gt;.  &lt;p align="justify"&gt;Добавим мелкие изменения, связанные с удалением одной колонки. Не забываем также вставить привязку  &lt;p align="justify"&gt; &lt;p style="margin:0px;font-family:courier new;background:white;color:black;font-size:10pt;" align="justify"&gt;&lt;span style="color:red;"&gt;IsChecked&lt;/span&gt;&lt;span style="color:blue;"&gt;="{&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Binding&lt;/span&gt;&lt;span style="color:red;"&gt; IsExpanded&lt;/span&gt;&lt;span style="color:blue;"&gt;,&lt;/span&gt;&lt;span style="color:red;"&gt; RelativeSource&lt;/span&gt;&lt;span style="color:blue;"&gt;={&lt;/span&gt;&lt;span style="color:#a31515;"&gt;RelativeSource&lt;/span&gt;&lt;span style="color:red;"&gt; Mode&lt;/span&gt;&lt;span style="color:blue;"&gt;=TemplatedParent,&lt;/span&gt;&lt;span style="color:red;"&gt; AncestorType&lt;/span&gt;&lt;span style="color:blue;"&gt;={&lt;/span&gt;&lt;span style="color:#a31515;"&gt;x&lt;/span&gt;&lt;span style="color:blue;"&gt;:&lt;/span&gt;&lt;span style="color:#a31515;"&gt;Null&lt;/span&gt;&lt;span style="color:blue;"&gt;}}}"&lt;/span&gt;&lt;/p&gt; &lt;p align="justify"&gt;в элемент &lt;font size="2" face="Courier New"&gt;TogleButton&lt;/font&gt;. Она почему-то не видна в шаблоне, если его извлекать при помощи &lt;font size="2" face="Courier New"&gt;XamlWriter&lt;/font&gt; и свойства &lt;font size="2" face="Courier New"&gt;Template&lt;/font&gt; соответствующего элемента управления.  &lt;p align="justify"&gt;Вот и все наш элемент готов и без единой строчки Code-Behind.  &lt;p&gt;&lt;a href="http://dev.net.ua/blogs/dmitrypeleshenko/clip_image004_403B316F.jpg"&gt;&lt;img style="border-right-width:0px;display:block;float:none;border-top-width:0px;border-bottom-width:0px;margin-left:auto;border-left-width:0px;margin-right:auto;" title="clip_image004" border="0" alt="clip_image004" src="http://dev.net.ua/blogs/dmitrypeleshenko/clip_image004_thumb_07142EA0.jpg" width="403" height="198"&gt;&lt;/a&gt;  &lt;p&gt;Полный код примера здесь: &lt;a href="http://cut.ms/GSu "&gt;DetailedTree&lt;/a&gt; или здесь: &lt;a href="http://cid-c22b7611bb9d0310.skydrive.live.com/browse.aspx/Samples"&gt;http://cid-c22b7611bb9d0310.skydrive.live.com/browse.aspx/Samples&lt;/a&gt;&lt;img src="http://dev.net.ua/aggbug.aspx?PostID=9045" width="1" height="1"&gt;</description><category domain="http://dev.net.ua/blogs/dmitrypeleshenko/archive/tags/WPF+TreeView+Multicolumn/default.aspx">WPF TreeView Multicolumn</category></item><item><title>Еще одно различие в WPF и WindowsForms</title><link>http://dev.net.ua/blogs/dmitrypeleshenko/archive/2009/11/02/8998.aspx</link><pubDate>Mon, 02 Nov 2009 20:25:00 GMT</pubDate><guid isPermaLink="false">434e5f47-9beb-46b7-aee2-adf5f643f7c6:8998</guid><dc:creator>Dmitry Peleshenko</dc:creator><slash:comments>0</slash:comments><comments>http://dev.net.ua/blogs/dmitrypeleshenko/comments/8998.aspx</comments><wfw:commentRss>http://dev.net.ua/blogs/dmitrypeleshenko/commentrss.aspx?PostID=8998</wfw:commentRss><description>&lt;p align="justify"&gt;Еще несколько слов о различиях в обработке фокуса в WPF и WindowsForms. Не могу удержаться, т.к. мои коллеги убеждают меня в том, что переходя на WPF, разработчик обязательно столкнется с неразрешимыми проблемами вроде той, что я описал в предыдущем посте.  &lt;p align="justify"&gt;Итак, снова приложение с несколькими вкладками. Понятно, что для быстрой и комфортной работы пользователя необходимо устанавливать фокус ввода на какой-то элемент при выборе вкладки, да и при запуске приложения тоже.  &lt;p align="justify"&gt;В старом добром WindowsForms как бы мы не расставляли значения своств TabIndex и TabStop, фокус все равно придется ставить вручную в каком-то обработчике событий (например, в SelectedIndexChanged элемента TabControl). Получается что вроде этого:  &lt;p&gt;&lt;font face="Courier New"&gt;private void tabControl_SelectedIndexChanged(object sender, EventArgs e)&lt;br&gt;{&lt;br&gt;&amp;nbsp;&amp;nbsp; if (tabControl.SelectedTab == myPage)&lt;br&gt;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; textBoxFromMyPage.Focus();&lt;br&gt;&amp;nbsp;&amp;nbsp; }&lt;br&gt;}&lt;/font&gt;&lt;/p&gt; &lt;p align="justify"&gt;В WPF все несколько иначе (и на мой взгляд логичнее), если у элемента расположенного на TabItem самый маленький TabIndex, то на него и будет установлен фокус ввода при выборе вкладки. Т.е. поведение фокуса ввода можно полностью задать в дизайнере, без единой строчки кода.  &lt;p align="justify"&gt;Единственное в чем может возникнуть затруднение это в установке фокуса в момент запуска приложения, но эта проблема также решается без обработки событий. Просто для одного из контейнеров (обычного того, содержимое которого будет видеть пользователь при запуске) следует установить свойство FocusManager.FocusedElement. Получится следующий код на XAML:  &lt;p&gt;&lt;font face="Courier New"&gt;&amp;lt;TabControl&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp; &amp;lt;TabItem Header="MyFirstTab"&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;WrapPanel FocusManager.FocusedElement="{Binding ElementName=myTextBox}"&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Button TabIndex="1"&amp;gt;The Button&amp;lt;/Button&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;TextBox x:Name="myTextBox" TabIndex="0"&amp;gt;The Text Box&amp;lt;/TextBox&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/WrapPanel&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp; &amp;lt;/TabItem&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp; &amp;lt;TabItem Header="MySeccondTab"&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;WrapPanel&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Button TabIndex="1"&amp;gt;The Button&amp;lt;/Button&amp;gt; &lt;br&gt;...&lt;/font&gt;&lt;/p&gt; &lt;p&gt;И все без единой строчки на С# или VB.Net.&lt;/p&gt;&lt;img src="http://dev.net.ua/aggbug.aspx?PostID=8998" width="1" height="1"&gt;</description><category domain="http://dev.net.ua/blogs/dmitrypeleshenko/archive/tags/WPF+TabIndex+FocusManager/default.aspx">WPF TabIndex FocusManager</category></item><item><title>Взаимодействие WPF и WindowsForms</title><link>http://dev.net.ua/blogs/dmitrypeleshenko/archive/2009/10/30/8988.aspx</link><pubDate>Thu, 29 Oct 2009 23:14:00 GMT</pubDate><guid isPermaLink="false">434e5f47-9beb-46b7-aee2-adf5f643f7c6:8988</guid><dc:creator>Dmitry Peleshenko</dc:creator><slash:comments>2</slash:comments><comments>http://dev.net.ua/blogs/dmitrypeleshenko/comments/8988.aspx</comments><wfw:commentRss>http://dev.net.ua/blogs/dmitrypeleshenko/commentrss.aspx?PostID=8988</wfw:commentRss><description>&lt;p align="justify"&gt;&lt;font size="2"&gt;Если Вы пытаетесь применять WPF не в абсолютно новом, а в прожившем какое-то время проекте, то наверняка столкнетесь с необходимостью взаимодействия между кусочками старого интерфейса на WindowsForms и новым интерфейсом WPF. Так и я некоторое время назад столкнулся с этой проблемой. &lt;/font&gt; &lt;p align="justify"&gt;&lt;font size="2"&gt;Задача заключалась в усовершенствовании части системы, которая включала в себя интерфейс на WindowsForms с несколькими вкладками, каждая из которых содержала UserControl. Переход на WPF следовало осуществить постепенно заменяя старые WindowsForms элементы новыми. Первым делом я создал макет бедующего приложения - окно с TabControl и две вкладки одна для WPF, другая для WindowsForms. На вкладке с WindowsForms размещен UserControl с несколькими элементами управления, занимающий всю вкладку.&lt;/font&gt;  &lt;p&gt;&lt;font size="2" face="Courier New"&gt;&amp;lt;TabControl SelectedIndex&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp; &amp;lt;TabItem Header="WPF"&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;WrapPanel&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Button TabIndex="1"&amp;gt;The Button&amp;lt;/Button&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;TextBox TabIndex="0"&amp;gt;The Text Box&amp;lt;/TextBox&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/WrapPanel&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp; &amp;lt;/TabItem&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp; &amp;lt;TabItem Header="Windows Form" x:Name="windowsFormsTab"&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;integration:WindowsFormsHost&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;this:TestControl x:Name="windowsFormsControl" /&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/integration:WindowsFormsHost&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp; &amp;lt;/TabItem&amp;gt;&lt;br&gt;&amp;lt;/TabControl&amp;gt;&lt;/font&gt; &lt;/p&gt; &lt;p align="justify"&gt;&lt;font size="2"&gt;В старом UserControl содержалось текстовое поле, на которое должен был быть установлен фокус ввода при выборе содержащей его вкладки. В WindowsForms эта проблема решалась обработкой события VisibleChanged класса UserControl. &lt;/font&gt; &lt;p&gt;&lt;font size="2" face="Courier New"&gt;if (Visible)&lt;br&gt;{&lt;br&gt;&amp;nbsp;&amp;nbsp; // Необходимо было также выделить все содержимое&lt;br&gt;&amp;nbsp;&amp;nbsp; textBox.SelectAll();&lt;br&gt;&amp;nbsp;&amp;nbsp; textBox.Focus();&lt;br&gt;}&lt;/font&gt; &lt;/p&gt; &lt;p align="justify"&gt;&lt;font size="2"&gt;В новом приложении этот подход работать перестал. Более того, при переключении на окна других приложений элементы WindowsForms безвозвратно теряли фокус.&lt;/font&gt;  &lt;p align="justify"&gt;&lt;font size="2"&gt;Попытка обрабатывать события Selector.Selected или GotFocus элемента TabItem не приблизили к желаемой цели. Оказалось что эти события происходят слишком рано и после этого UserControl получает массу сообщений и в результате теряет фокус. Тоже самое касается и события Activated окна WPF.&lt;/font&gt;  &lt;p align="justify"&gt;&lt;font size="2"&gt;Потратив кучу времени на поиск решения я не нашел ничего кроме констатации факта существования данной проблемы. Но решение все же нашлось. Решение &lt;strong&gt;ЖУТКОЕ&lt;/strong&gt;, крайне ненадежное, но все же в &lt;strong&gt;99%&lt;/strong&gt; случаев приводящее к желаемому результату – отложить &lt;/font&gt;&lt;font size="2"&gt;установку фокуса в UserControl на некоторое время.&lt;/font&gt;  &lt;p&gt;&lt;font face="Courier New"&gt;private void SetFocuToWindowsForms()&lt;br&gt;{&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ThreadPool.QueueUserWorkItem(new WaitCallback(delegate(object o)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&lt;/font&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font face="Courier New"&gt;//Ждем пока WPF проделает &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //все что хочет с нашим UserControl&lt;/font&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font face="Courier New"&gt;Thread.Sleep(100);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; windowsFormsControl.Invoke(new Func&amp;lt;bool&amp;gt;(windowsFormsControl.Focus));&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }));&lt;br&gt;} &lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Courier New"&gt;private void WpfWindow_Activated(object sender, EventArgs e)&lt;br&gt;{&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (wfTab.IsSelected)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SetFocuToWindowsForms();&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;} &lt;/font&gt; &lt;p&gt;&lt;font face="Courier New"&gt;private void windowsFormsTab_Selected(object sender, RoutedEventArgs e)&lt;br&gt;{&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; SetFocuToWindowsForms();&lt;br&gt;}&lt;/font&gt;  &lt;p align="justify"&gt;Повторюсь еще раз, что этот код может не работать в некоторых ситуация, но другого решения найти пока не удалось.&lt;/p&gt;&lt;img src="http://dev.net.ua/aggbug.aspx?PostID=8988" width="1" height="1"&gt;</description><category domain="http://dev.net.ua/blogs/dmitrypeleshenko/archive/tags/WPF+WindowsForms+WindowsFormsHost/default.aspx">WPF WindowsForms WindowsFormsHost</category></item><item><title>Автоматизированное построение интерпретаторов с помощью ANTLR 3</title><link>http://dev.net.ua/blogs/dmitrypeleshenko/archive/2007/07/06/3604.aspx</link><pubDate>Fri, 06 Jul 2007 13:49:00 GMT</pubDate><guid isPermaLink="false">434e5f47-9beb-46b7-aee2-adf5f643f7c6:3604</guid><dc:creator>Dmitry Peleshenko</dc:creator><slash:comments>0</slash:comments><comments>http://dev.net.ua/blogs/dmitrypeleshenko/comments/3604.aspx</comments><wfw:commentRss>http://dev.net.ua/blogs/dmitrypeleshenko/commentrss.aspx?PostID=3604</wfw:commentRss><description>&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="#ff0000"&gt;Н&lt;/font&gt;едавно возникла проблема, необходимо было разработать небольшой интерпретатор. Причем необходимо было использовать его в проекте на .NET Framework и интерпретатор должен полностью состоять из управляемого кода, т.к. необходимо использовать CAS. Первое что приходит в голову в таких случаях это старый добрый bison. Давно проверенное и привычное средство автоматизированного построения парсеров, интерпретаторов и т.д. Первым делом я попытался найти аналог bison для C#. Действительно существует такое средство, называется Gardens Point Parser Generator (gppg). Инструмент не совсем поддерживает формат грамматики для&amp;nbsp; bison и содержит отличия связанные с использованием .NET Framework и что самое главное,&amp;nbsp; gppg ограничивает правую часть правила всего восемью членами. Конечно можно постараться преобразовать грамматику&amp;nbsp; к такому виду, но это создает определенные неудобства, необходимо создавать дополнительные нетерминальные символы и т.д. &lt;br&gt;Просмотрев ряд других средств для построения интерпретаторов, я остановился на инструменте под названием ANother Tool for Language Recognition (ANTLR). &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="#ff0000"&gt;К&lt;/font&gt;ак и bison ANTLR принимает на вход грамматику и генерирует на выходе синтаксический анализатор реализованный на целевом языке. ANTLR способен строить анализаторы для LL(*) грамматик – расширения LL(k) грамматик. Это дает большую свободу при&amp;nbsp; описании языков в сравнении с LALR(1) грамматиками bison. Не вдаваясь в теоретические подробности рассмотрим следующую грамматику:&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;b&gt; S::={ A | B }*&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; A::=a | a b c&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; B::=b d&lt;/b&gt;&lt;br&gt;&lt;br&gt;и следующую цепочку, являющуюся одним из порождений этой грамматики: &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;b&gt;abd&lt;/b&gt;&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="#ff0000"&gt;П&lt;/font&gt;осле прочтения терминала a и обнаружения терминала b в look-ahead буфере единичной длинны невозможно решить, является ли ab началом последовательности &lt;b&gt;abc&lt;/b&gt;, которую можно свернуть по правилу &lt;b&gt;A::=abc&lt;/b&gt; или же эту последовательность нужно сворачивать по правилам &lt;b&gt;A::=a&lt;/b&gt; и &lt;b&gt;B::=b d&lt;/b&gt;. Для этого решения необходима информация о терминале, следующем за b в рассматриваемой последовательности, т.е. буфер просмотра вперед должен содержать два терминала, а не один. Размер этого буфера у анализатора, сгенерированного bison как раз равен единице – он предназначен для разбора LALR(1)-грамматик. В этом случае Вам придется преобразовывать свою грамматику. При использовании ANTLR никаких преобразований не требуется.&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="#ff0000"&gt;С&lt;/font&gt;огласно описанию ANTLR, LL(*) грамматика – это LL(k) грамматика в которой k может неограниченно возрастать. Рассмотрим еще один пример:&lt;font face="Courier New"&gt;&lt;br&gt;&lt;br&gt;&lt;/font&gt;&lt;font face="Courier New"&gt;&lt;font color="#008000"&gt;// "int f(int x,int y);"&lt;br&gt;&lt;/font&gt;&lt;/font&gt;&lt;font face="Courier New"&gt;&lt;font color="#008000"&gt;// "int f() {...}"&lt;/font&gt;&lt;/font&gt;&lt;font face="Courier New"&gt;&lt;b&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp; method ::= type ID '(' args ')' ';'&lt;/b&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;b&gt;&amp;nbsp; | type ID '(' args ')' '{' body '}' &lt;/b&gt;&amp;nbsp;&amp;nbsp; &lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp; &lt;b&gt;type ::= 'void' | 'int' &lt;/b&gt;&lt;br&gt;&lt;/font&gt;&lt;font face="Courier New"&gt;&lt;font color="#008000"&gt;&lt;br&gt;// "int x, int y, int z, ..."&lt;/font&gt;&lt;/font&gt;&lt;br&gt;&lt;font face="Courier New"&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp; args ::= arg (',' arg)* &amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/b&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp; &lt;b&gt;arg&amp;nbsp; ::= 'int' ID &lt;/b&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp; &lt;b&gt;body ::= ... &lt;/b&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt; &lt;font color="#ff0000"&gt;Т&lt;/font&gt;акая грамматика не является LL(k) грамматикой, т.к. неизвестно какой длинны должен быть look-ahead буфер, т.е. нельзя заранее определить значение k. Это происходит потому, что цепочка начинающаяся с &lt;b&gt;type ID '('&lt;/b&gt; далее может содержать неограниченное число конструкций arg, а для выбора альтернативы, в первом правеле, необходимо проанализировать последние 3 символа цепочки. Такая грамматика классифицируется как LL(*) и ANTLR начиная с версии 3 успешено справляется с такими грамматиками. &lt;br&gt;Целевым языком для bison является С++, для gppg – С#, для ANTLR это могут быть Java, С++ или С#. Для того чтобы не просто определить принадлежит ли некоторая цепочка заданной грамматике а еще и выполнять какие-то действия в процессе разбора этой цепочки в ANTLR как и в bison в каждом правиле задаются эти самые действия выраженные на целевом языке. Действия задаются для каждой альтернативы правила. И здесь снова прослеживается ряд приятных отличий от&amp;nbsp; bison: &lt;ul&gt;&lt;li&gt;существует блок init выполняемый перед кодом из любой альтернативы;&lt;/li&gt;&lt;li&gt;правила могут иметь параметры;&lt;/li&gt;&lt;li&gt;обращение к символам правой части правила осуществляется не по номерам а с помощью идентификаторов.&lt;/li&gt;&lt;/ul&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="#ff0000"&gt;С&lt;/font&gt;оздатели ANTLR утверждают, что многие приимущества при определении действий для правил являются следствием того, что ANTLR осуществляет LL рразбор, т.е. использует разбор сверху вниз, в отличии от bison и gppg, которые используют разбор снизу вверх. &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="#ff0000"&gt;К&lt;/font&gt;роме того ANTLR выгодно отличается от других наличием визуальной среды разработки ANTLRWorks, позволяющей создавать и отлаживать грамматики.&lt;br&gt;&lt;div align="center"&gt;&lt;br&gt;&lt;br&gt;&lt;img src="http://dev.net.ua/photos/dmitrypeleshenko/images/3603/425x326.aspx"&gt;&lt;br&gt;&lt;br&gt;&lt;/div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="#ff0000"&gt;З&lt;/font&gt;десь приведены далеко не все возможности ANTLR, есть также возможность построения деревьев разбора, использовани синтаксических и сематических предикатов, которые позволяют разработчику вмешаться в процесс разбора, и многое другое.&lt;br&gt;&lt;img src="http://dev.net.ua/aggbug.aspx?PostID=3604" width="1" height="1"&gt;</description></item><item><title>Наблюдение за кешированием</title><link>http://dev.net.ua/blogs/dmitrypeleshenko/archive/2007/02/28/2556.aspx</link><pubDate>Wed, 28 Feb 2007 21:22:00 GMT</pubDate><guid isPermaLink="false">434e5f47-9beb-46b7-aee2-adf5f643f7c6:2556</guid><dc:creator>Dmitry Peleshenko</dc:creator><slash:comments>1</slash:comments><comments>http://dev.net.ua/blogs/dmitrypeleshenko/comments/2556.aspx</comments><wfw:commentRss>http://dev.net.ua/blogs/dmitrypeleshenko/commentrss.aspx?PostID=2556</wfw:commentRss><description>&amp;nbsp; &lt;font color="#ff0000"&gt;И&lt;/font&gt;зучая ASP.NET я недавно наткнулся на определенные трудности с кэшированием страниц на прокси серверах. Задавал даже вопрос на форуме. Спасибо 2 Mike Chaliy предложенное решение вполне работоспособно. Но я нашел еще кое что на эту тему. Причем все обнаруженные мной особенности никак &lt;u&gt;не проявляли себя&lt;/u&gt; при тестировании &lt;u&gt;на локальной машине и в локальной сети&lt;/u&gt;.&lt;br&gt;&amp;nbsp; На своей домашней машине я установил IIS и разработал небольшое ASP.NET приложение для управления файлами на сервере и для отправки сообщений на сервер. Все работало замечательно на локальной машине во время отладки. И даже из локальной сети все тоже выглядело превосходно. На следующий день, воспользовавшись всеми прелестями ADSL от Укртелеком и DynamicDNS, я отправился в ХИРЭ "поуправлять" своей машиной удаленно. Выход в инет там организован через прокси, да еще и на кафедре стоит свой маленький прокси. С успехом загрузилась первая страничка, но потом все перестало работать, запросы до сервера не доходили а ответы грузились из кеша прокси, вобщем работать было невозможно. Нажимая сабмит я получал все ту же страничку. Псоле вопроса на форуме я вставил&lt;br&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;br&gt;&amp;nbsp;&amp;nbsp; &lt;font color="#008000"&gt;&amp;nbsp;Response&lt;/font&gt;&lt;font color="#ff0000"&gt;.&lt;/font&gt;Cache&lt;font color="#ff0000"&gt;.&lt;/font&gt;SetCacheability&lt;font color="#ff0000"&gt;(&lt;/font&gt;HttpCacheability&lt;font color="#ff0000"&gt;.&lt;/font&gt;&lt;font color="#008000"&gt;NoCache&lt;/font&gt;&lt;font color="#ff0000"&gt;);&lt;/font&gt;&lt;br&gt;&lt;br&gt;во все веб-формы в обработчик Page_Load. Желаемый результат был достигнут. Мне показалась странной необходимость вставлять эту строчку. Почитав документацию по ASP.NET я нашел там такую вот директиву &lt;br&gt;&lt;br&gt;&amp;nbsp;&lt;b&gt;&amp;nbsp; &amp;nbsp;&lt;/b&gt;&amp;lt;%@ OutputCache Duration="1" VaryByParam="None" %&amp;gt;&lt;br&gt;&lt;br&gt;&amp;nbsp; Размещаете ее на каждой странице и все работает нормально, Duration задается в секундах. Есть еще куча параметров по настройке кеширования. Кешировать, оказывается, можно на сервере, на прокси или клиенте и исключительно на клиенте. Причем директива применима как к странице целиком, так и к UserControl.&lt;br&gt;&amp;nbsp; Порывшись в настройках IIS нашел там в разделе заголовков HTTP настройки срока действия содержимого и тут же установил настройку "истекает немедленно". Убрал все дополнительные настройки кэширования с веб-форм. Проверил все работает отлично, с одним только недостатком. Кнопочки на своей страничке я приукрасил повесив на них картинку и на &lt;i&gt;onmouseover&lt;/i&gt; и &lt;i&gt;onmouseout&lt;/i&gt; соответсвующие Java-скрипты меняющие картинку. Картинка естественно грузилась с моего сервера и при каждом срабатывании скрипта, &lt;u&gt;а не при первом&lt;/u&gt;, кнопка становилась черной а потом загружалась соответствующая картинка, т.к. картинка подобно всему содержимому не кэшировалась браузером.&amp;nbsp; Вобщем отвратительно выглядело. В итоге я решил вернутся к варианту №2 указав соответствующие директивы в каждой форме и изменив настройку IIS на однодневный срок действия содержимого. Этот вариант работал наиболее приемлемо.&lt;br&gt;&amp;nbsp; Самое интересное что на локальной машине и в локальной сети ничего не кэшировалось вообще и все выглядело так, будто эти настройки не дают вообще никакого эффекта, хотя я и не протестировал все возможные параметры &lt;b&gt;@OutputCache&lt;/b&gt;.&lt;br&gt;&amp;nbsp; Приложение было очень простым и то вызывало недоумение первые несколько секунд, представляю что будет с более сложными если не позаботится о правильном кэшировании.&lt;img src="http://dev.net.ua/aggbug.aspx?PostID=2556" width="1" height="1"&gt;</description></item></channel></rss>