<?xml version="1.0" encoding="utf-8"?>

<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
	<channel>
		<title>Форум программистов и сисадминов Киберфорум - Блоги - Элд Хасп</title>
		<link>https://www.cyberforum.ru/blogs/1297115/</link>
		<description>КиберФорум - форум программистов, системных администраторов, администраторов баз данных, компьютерный форум, форум по электронике и бытовой технике, обсуждение софта. Бесплатная помощь в решении задач по программированию и наукам, решение проблем с компьютером, операционными системам</description>
		<language>ru</language>
		<lastBuildDate>Tue, 22 Sep 2026 22:50:10 GMT</lastBuildDate>
		<generator>vBulletin</generator>
		<ttl>60</ttl>
		<image>
			<url>https://www.cyberforum.ru//cyberstatic.net/images/misc/rss.jpg</url>
			<title>Форум программистов и сисадминов Киберфорум - Блоги - Элд Хасп</title>
			<link>https://www.cyberforum.ru/blogs/1297115/</link>
		</image>
		<item>
			<title>Пример реализации WPF+MVVM приложения</title>
			<link>https://www.cyberforum.ru/blogs/1297115/5602.html</link>
			<pubDate>Wed, 26 Dec 2018 03:00:37 GMT</pubDate>
			<description>Пример решения ТЗ по теме https://www.cyberforum.ru/wpf-silverlight/thread2379434.html 
В теме...</description>
			<content:encoded><![CDATA[<div>Пример решения ТЗ по теме <a href="https://www.cyberforum.ru/wpf-silverlight/thread2379434.html">https://www.cyberforum.ru/wpf-... 79434.html</a><br />
В теме поставлена задача реализовать: поиск слов по списку слов, отображение списка слов, дополнение списка слов.<br />
<br />
В любом решении WPF используются интерфейсы <b>ICommand</b> для команд  и интерфейс <b>INotifyPropertyChanged </b>(сокращёно <b>INPC</b>) для свойств <b>ViewModel</b>. Поэтому в моих решениях всегда есть два класса:<br />
<b>RelayCommand </b>- реализующий интерфейс <b>ICommand </b><br />

			   <div class="spoiler-wrap">
				   <div class="spoiler-head folded clickable">Кликните здесь для просмотра всего текста</div>
				   <div class="spoiler-body">
					   <div class="codeblock"><table class="csharp"><thead><tr><td colspan="2" id="574747382"  class="head">C#</td></tr></thead><tbody><tr class="li1"><td><div id="574747382" style="height: 350px" class="codeframe"><table><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
</pre></td><td class="de1"><pre class="de1">&nbsp; &nbsp; <span class="kw1">public</span> <span class="kw4">class</span> RelayCommand <span class="sy0">:</span> ICommand
&nbsp; &nbsp; <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">public</span> <span class="kw1">event</span> EventHandler CanExecuteChanged<span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">private</span> <span class="kw1">readonly</span> Func<span class="sy0">&lt;</span><span class="kw4">object</span>, <span class="kw4">bool</span><span class="sy0">&gt;</span> _canExecute<span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">private</span> <span class="kw1">readonly</span> Action<span class="sy0">&lt;</span><span class="kw4">object</span><span class="sy0">&gt;</span> _onExecute<span class="sy0">;</span>
&nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">/// &lt;summary&gt;Конструктор команды&lt;/summary&gt;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">/// &lt;param name=&quot;execute&quot;&gt;Выполняемый метод команды&lt;/param&gt;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">/// &lt;param name=&quot;canExecute&quot;&gt;Метод разрешающий выполнение команды&lt;/param&gt;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">public</span> RelayCommand<span class="br0">&#40;</span>Action<span class="sy0">&lt;</span><span class="kw4">object</span><span class="sy0">&gt;</span> execute, Func<span class="sy0">&lt;</span><span class="kw4">object</span>, <span class="kw4">bool</span><span class="sy0">&gt;</span> canExecute <span class="sy0">=</span> <span class="kw1">null</span><span class="br0">&#41;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; _onExecute <span class="sy0">=</span> execute<span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; _canExecute <span class="sy0">=</span> canExecute<span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>
&nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">/// &lt;summary&gt;Вызов разрешающего метода команды&lt;/summary&gt;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">/// &lt;param name=&quot;parameter&quot;&gt;Параметр команды&lt;/param&gt;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">/// &lt;returns&gt;True? если выполнение команды разрешено&lt;/returns&gt;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">public</span> <span class="kw4">bool</span> CanExecute<span class="br0">&#40;</span><span class="kw4">object</span> parameter<span class="br0">&#41;</span> <span class="sy0">=&gt;</span> _canExecute <span class="sy0">==</span> <span class="kw1">null</span> <span class="sy0">?</span> <span class="kw1">true</span> <span class="sy0">:</span> _canExecute<span class="sy0">.</span><span class="me1">Invoke</span><span class="br0">&#40;</span>parameter<span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">/// &lt;summary&gt;Вызов выполняющего метода команды&lt;/summary&gt;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">/// &lt;param name=&quot;parameter&quot;&gt;Параметр команды&lt;/param&gt;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">public</span> <span class="kw4">void</span> Execute<span class="br0">&#40;</span><span class="kw4">object</span> parameter<span class="br0">&#41;</span> <span class="sy0">=&gt;</span> _onExecute<span class="sy0">?.</span><span class="me1">Invoke</span><span class="br0">&#40;</span>parameter<span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp; &nbsp; <span class="br0">&#125;</span></pre></td></tr></table></div></td></tr></tbody></table></div>
				   </div>
			   </div><b>OnPropertyChangedClass </b>- реализующий интерфейс  <b>INotifyPropertyChanged </b>
			   <div class="spoiler-wrap">
				   <div class="spoiler-head folded clickable">Кликните здесь для просмотра всего текста</div>
				   <div class="spoiler-body">
					   <div class="codeblock"><table class="csharp"><thead><tr><td colspan="2" id="937616319"  class="head">C#</td></tr></thead><tbody><tr class="li1"><td><div id="937616319" style="height: 350px" class="codeframe"><table><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
</pre></td><td class="de1"><pre class="de1">&nbsp; &nbsp; <span class="co1">/// &lt;summary&gt;Базовый класс с реализацией INPC &lt;/summary&gt;</span>
&nbsp; &nbsp; <span class="kw1">public</span> <span class="kw4">class</span> OnPropertyChangedClass <span class="sy0">:</span> INotifyPropertyChanged
&nbsp; &nbsp; <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">/// &lt;summary&gt;Событие для извещения об изменения свойства&lt;/summary&gt;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">public</span> <span class="kw1">event</span> PropertyChangedEventHandler PropertyChanged<span class="sy0">;</span>
&nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">/// &lt;summary&gt;Метод для вызова события извещения об изменении свойства&lt;/summary&gt;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">/// &lt;param name=&quot;prop&quot;&gt;Изменившееся свойство или список свойств через разделители &quot;\\/\r \n()\&quot;\'-&quot;&lt;/param&gt;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">public</span> <span class="kw4">void</span> OnPropertyChanged<span class="br0">&#40;</span><span class="br0">&#91;</span>CallerMemberName<span class="br0">&#93;</span><span class="kw4">string</span> prop <span class="sy0">=</span> <span class="st0">&quot;&quot;</span><span class="br0">&#41;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">string</span><span class="br0">&#91;</span><span class="br0">&#93;</span> names <span class="sy0">=</span> prop<span class="sy0">.</span><span class="me1">Split</span><span class="br0">&#40;</span><span class="st0">&quot;<span class="es0">\\</span>/<span class="es0">\r</span> <span class="es0">\n</span>()<span class="es0">\&quot;</span><span class="es0">\'</span>-&quot;</span><span class="sy0">.</span><span class="me1">ToArray</span><span class="br0">&#40;</span><span class="br0">&#41;</span>, StringSplitOptions<span class="sy0">.</span><span class="me1">RemoveEmptyEntries</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>names<span class="sy0">.</span><span class="me1">Length</span> <span class="sy0">!=</span> <span class="nu0">0</span><span class="br0">&#41;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">foreach</span> <span class="br0">&#40;</span><span class="kw4">string</span> _prp <span class="kw1">in</span> names<span class="br0">&#41;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; PropertyChanged<span class="sy0">?.</span><span class="me1">Invoke</span><span class="br0">&#40;</span><span class="kw1">this</span>, <span class="kw3">new</span> PropertyChangedEventArgs<span class="br0">&#40;</span>_prp<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>
&nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">/// &lt;summary&gt;Метод для вызова события извещения об изменении списка свойств&lt;/summary&gt;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">/// &lt;param name=&quot;propList&quot;&gt;Последовательность имён свойств&lt;/param&gt;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">public</span> <span class="kw4">void</span> OnPropertyChanged<span class="br0">&#40;</span>IEnumerable<span class="sy0">&lt;</span><span class="kw4">string</span><span class="sy0">&gt;</span> propList<span class="br0">&#41;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">foreach</span> <span class="br0">&#40;</span><span class="kw4">string</span> _prp <span class="kw1">in</span> propList<span class="sy0">.</span><span class="kw1">Where</span><span class="br0">&#40;</span>name <span class="sy0">=&gt;</span> <span class="sy0">!</span><span class="kw4">string</span><span class="sy0">.</span><span class="me1">IsNullOrWhiteSpace</span><span class="br0">&#40;</span>name<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; PropertyChanged<span class="sy0">?.</span><span class="me1">Invoke</span><span class="br0">&#40;</span><span class="kw1">this</span>, <span class="kw3">new</span> PropertyChangedEventArgs<span class="br0">&#40;</span>_prp<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>
&nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">/// &lt;summary&gt;Метод для вызова события извещения об изменении списка свойств&lt;/summary&gt;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">/// &lt;param name=&quot;propList&quot;&gt;Последовательность свойств&lt;/param&gt;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">public</span> <span class="kw4">void</span> OnPropertyChanged<span class="br0">&#40;</span>IEnumerable<span class="sy0">&lt;</span>PropertyInfo<span class="sy0">&gt;</span> propList<span class="br0">&#41;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">foreach</span> <span class="br0">&#40;</span>PropertyInfo _prp <span class="kw1">in</span> propList<span class="br0">&#41;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; PropertyChanged<span class="sy0">?.</span><span class="me1">Invoke</span><span class="br0">&#40;</span><span class="kw1">this</span>, <span class="kw3">new</span> PropertyChangedEventArgs<span class="br0">&#40;</span>_prp<span class="sy0">.</span><span class="me1">Name</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>
&nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">/// &lt;summary&gt;Метод для вызова события извещения об изменении всех свойств&lt;/summary&gt;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">public</span> <span class="kw4">void</span> OnAllPropertyChanged<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="sy0">=&gt;</span> OnPropertyChanged<span class="br0">&#40;</span>GetType<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">.</span><span class="me1">GetProperties</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp; &nbsp; <span class="br0">&#125;</span></pre></td></tr></table></div></td></tr></tbody></table></div>
				   </div>
			   </div><br />
В паттерне <b>MVVM</b> создание приложения начинается с создания <b>Model</b> (Модели). В нашем случае в <b>Модели </b>должны быть реализованы методы и свойство:<ul><li>Чтение списка слов из файла</li>
<li>Сохранение списка слов в файле</li>
<li>Пополнение списка слов</li>
<li>Поиск по списку слов с возвратом результата поиска</li>
<li>Свойство возвращающие коллекцию из списка слов. Так как коллекция предназначена для привязки к WPF элементу, то она должна поддерживать интерфейс <b>INotifyCollectionChanged </b>(сокращёно <b>INCC</b>).</li>
</ul>Во многих случаях для <b>Модели </b>удобно выбрать статический класс. Так же сделаем и для этого решения.<br />
Класс <b>Модели </b>- <b>FuzzySearch_Model</b>
			   <div class="spoiler-wrap">
				   <div class="spoiler-head folded clickable">Кликните здесь для просмотра всего текста</div>
				   <div class="spoiler-body">
					   <div class="codeblock"><table class="csharp"><thead><tr><td colspan="2" id="31715611"  class="head">C#</td></tr></thead><tbody><tr class="li1"><td><div id="31715611" style="height: 350px" class="codeframe"><table><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
</pre></td><td class="de1"><pre class="de1">&nbsp; &nbsp; <span class="co1">/// &lt;summary&gt;Статический класс модели данных&lt;/summary&gt;</span>
&nbsp; &nbsp; <span class="kw1">public</span> <span class="kw1">static</span> <span class="kw4">class</span> FuzzySearch_Model
&nbsp; &nbsp; <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">static</span> ObservableCollection<span class="sy0">&lt;</span><span class="kw4">string</span><span class="sy0">&gt;</span> _listWords<span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">/// &lt;summary&gt;Список слов&lt;/summary&gt;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">public</span> <span class="kw1">static</span> ObservableCollection<span class="sy0">&lt;</span><span class="kw4">string</span><span class="sy0">&gt;</span> ListWords
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">get</span> <span class="sy0">=&gt;</span> _listWords <span class="sy0">??</span> <span class="br0">&#40;</span>_listWords <span class="sy0">=</span> <span class="kw3">new</span> ObservableCollection<span class="sy0">&lt;</span><span class="kw4">string</span><span class="sy0">&gt;</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">private</span> <span class="kw1">set</span> <span class="sy0">=&gt;</span> _listWords <span class="sy0">=</span> <span class="kw1">value</span><span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>
&nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">/// &lt;summary&gt;Сохранение списка слов в файле&lt;/summary&gt;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">/// &lt;param name=&quot;NameFile&quot;&gt;Имя файла&lt;/param&gt;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">public</span> <span class="kw1">static</span> <span class="kw4">void</span> Save<span class="br0">&#40;</span><span class="kw4">string</span> NameFile <span class="sy0">=</span> <span class="kw1">null</span><span class="br0">&#41;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="kw4">string</span><span class="sy0">.</span><span class="me1">IsNullOrWhiteSpace</span><span class="br0">&#40;</span>NameFile<span class="br0">&#41;</span><span class="br0">&#41;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; NameFile <span class="sy0">=</span> <span class="st0">&quot;ListWords.txt&quot;</span><span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; StreamWriter file <span class="sy0">=</span> <span class="kw1">null</span><span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">try</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; file <span class="sy0">=</span> <span class="kw3">new</span> StreamWriter<span class="br0">&#40;</span>NameFile, <span class="kw1">false</span>, Encoding<span class="sy0">.</span><span class="kw1">Default</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">foreach</span> <span class="br0">&#40;</span><span class="kw4">string</span> word <span class="kw1">in</span> ListWords<span class="br0">&#41;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; file<span class="sy0">.</span><span class="me1">WriteLine</span><span class="br0">&#40;</span>word<span class="sy0">.</span><span class="me1">ToLower</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">catch</span> <span class="br0">&#40;</span>Exception<span class="br0">&#41;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; MessageBox<span class="sy0">.</span><span class="me1">Show</span><span class="br0">&#40;</span><span class="st0">&quot;Ошибка записи в файл!&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>file <span class="sy0">!=</span> <span class="kw1">null</span><span class="br0">&#41;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; file<span class="sy0">.</span><span class="me1">Close</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>
&nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">/// &lt;summary&gt;Чтение списка слов из файла&lt;/summary&gt;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">/// &lt;param name=&quot;NameFile&quot;&gt;Имя файла&lt;/param&gt;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">public</span> <span class="kw1">static</span> <span class="kw4">void</span> Load<span class="br0">&#40;</span><span class="kw4">string</span> NameFile <span class="sy0">=</span> <span class="kw1">null</span><span class="br0">&#41;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="kw4">string</span><span class="sy0">.</span><span class="me1">IsNullOrWhiteSpace</span><span class="br0">&#40;</span>NameFile<span class="br0">&#41;</span><span class="br0">&#41;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; NameFile <span class="sy0">=</span> <span class="st0">&quot;ListWords.txt&quot;</span><span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="sy0">!</span>File<span class="sy0">.</span><span class="me1">Exists</span><span class="br0">&#40;</span>NameFile<span class="br0">&#41;</span><span class="br0">&#41;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; File<span class="sy0">.</span><span class="me1">Create</span><span class="br0">&#40;</span>NameFile<span class="br0">&#41;</span><span class="sy0">.</span><span class="me1">Close</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; StreamReader file <span class="sy0">=</span> <span class="kw1">null</span><span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">try</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; file <span class="sy0">=</span> <span class="kw3">new</span> StreamReader<span class="br0">&#40;</span>NameFile, Encoding<span class="sy0">.</span><span class="kw1">Default</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ListWords <span class="sy0">=</span> <span class="kw3">new</span> ObservableCollection<span class="sy0">&lt;</span><span class="kw4">string</span><span class="sy0">&gt;</span><span class="br0">&#40;</span>file<span class="sy0">.</span><span class="me1">ReadToEnd</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">.</span><span class="me1">Split</span><span class="br0">&#40;</span><span class="st0">&quot;<span class="es0">\r</span><span class="es0">\n</span> &quot;</span><span class="sy0">.</span><span class="me1">ToCharArray</span><span class="br0">&#40;</span><span class="br0">&#41;</span>, StringSplitOptions<span class="sy0">.</span><span class="me1">RemoveEmptyEntries</span><span class="br0">&#41;</span><span class="sy0">.</span><span class="kw1">Select</span><span class="br0">&#40;</span>wrd <span class="sy0">=&gt;</span> wrd<span class="sy0">.</span><span class="me1">ToLower</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">catch</span> <span class="br0">&#40;</span>Exception<span class="br0">&#41;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; MessageBox<span class="sy0">.</span><span class="me1">Show</span><span class="br0">&#40;</span><span class="st0">&quot;Ошибка чтения из файла!&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>file <span class="sy0">!=</span> <span class="kw1">null</span><span class="br0">&#41;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; file<span class="sy0">.</span><span class="me1">Close</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>
&nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">/// &lt;summary&gt;Добавление слова в список&lt;/summary&gt;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">/// &lt;param name=&quot;Words&quot;&gt;Слово или список слов разделённых переносом строки или пробелом&lt;/param&gt;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">public</span> <span class="kw1">static</span> <span class="kw4">void</span> AddWord<span class="br0">&#40;</span><span class="kw4">string</span> Words<span class="br0">&#41;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">foreach</span> <span class="br0">&#40;</span><span class="kw4">string</span> word <span class="kw1">in</span> Words<span class="sy0">.</span><span class="me1">Split</span><span class="br0">&#40;</span><span class="st0">&quot;<span class="es0">\r</span><span class="es0">\n</span> &quot;</span><span class="sy0">.</span><span class="me1">ToCharArray</span><span class="br0">&#40;</span><span class="br0">&#41;</span>, StringSplitOptions<span class="sy0">.</span><span class="me1">RemoveEmptyEntries</span><span class="br0">&#41;</span><span class="br0">&#41;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ListWords<span class="sy0">.</span><span class="kw1">Add</span><span class="br0">&#40;</span>word<span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>
&nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">/// &lt;summary&gt;Поиск слова в списке&lt;/summary&gt;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">/// &lt;param name=&quot;Word&quot;&gt;Одно слово&lt;/param&gt;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">/// &lt;returns&gt;Результат поиска&lt;/returns&gt;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">public</span> <span class="kw1">static</span> <span class="kw4">string</span> SearchWord<span class="br0">&#40;</span><span class="kw4">string</span> Word<span class="br0">&#41;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">string</span><span class="br0">&#91;</span><span class="br0">&#93;</span> wordArr <span class="sy0">=</span> Word<span class="sy0">.</span><span class="me1">ToLower</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">.</span><span class="me1">Split</span><span class="br0">&#40;</span><span class="st0">&quot;<span class="es0">\r</span><span class="es0">\n</span> &quot;</span><span class="sy0">.</span><span class="me1">ToCharArray</span><span class="br0">&#40;</span><span class="br0">&#41;</span>, StringSplitOptions<span class="sy0">.</span><span class="me1">RemoveEmptyEntries</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>wordArr<span class="sy0">.</span><span class="me1">Length</span> <span class="sy0">!=</span> <span class="nu0">1</span><span class="br0">&#41;</span> <span class="kw1">return</span> <span class="st0">&quot;Ошибка ввода&quot;</span><span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Word <span class="sy0">=</span> wordArr<span class="br0">&#91;</span><span class="nu0">0</span><span class="br0">&#93;</span><span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">int</span> index <span class="sy0">=</span> ListWords<span class="sy0">.</span><span class="me1">IndexOf</span><span class="br0">&#40;</span>Word<span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>index <span class="sy0">&gt;=</span> <span class="nu0">0</span><span class="br0">&#41;</span> <span class="kw1">return</span> <span class="st0">&quot;Tочное совпадение со словом по индексу &quot;</span> <span class="sy0">+</span> index<span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">/// *************************</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">/// Нечёткий поиск</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">/// *************************</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="st0">&quot;Результат нечёткого поиска&quot;</span><span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>
&nbsp; &nbsp; <span class="br0">&#125;</span></pre></td></tr></table></div></td></tr></tbody></table></div>
				   </div>
			   </div>После создания <b>Модели </b>создаётся <b>View </b>(Представление). Задачей <b>View </b>является <b>ОТОБРАЖЕНИЕ </b>данных. Ни какой обработки данных в <b>View </b>быть не должно! В отображение данных входит непосредственно показ самих данных, редактирование значений данных, WPF конвертация данных в удобный для отображения вид,  команды для элементов (в первую очередь для кнопок и меню).<br />
При создании <b>View </b>элементы надо к чему-то привязывать. Создавать абстрактные привязки, в которых на момент редактирования ничего нет, визуально трудно и приводит к многочисленным ошибкам. Поэтому перед созданием <b>View </b>надо создать <b>ViewModel DesignData</b> (Модель представления времени разработки). Она может быть как единая для всей <b>View</b>, так и раздробленная - отдельная для каждого элемента. И надо понимать <b>VMDD</b> - это часть <b>View</b>, а не <b>VM</b>. И заполняется данными она в <b>XAML</b>. Изменяя эти данные, очень удобно видеть как меняется <b>View</b>. Особенно в случаях когда в зависимости от данных должны скрываться/показываться разные элементы.<br />
<b>VM</b>, в дальнейшем, удобно наследовать от <b>VMDD</b>. А так как <b>VM</b> должна поддерживать интерфейс <b>INPC</b>, класс <b>VMDD</b> будем наследовать от класса <b>OnPropertyChangedClass</b>. Для привязки команд в <b>VMDD</b> будем использовать класс <b>RelayCommand</b>.<br />
Класс <b>VMDD </b>- <b>FuzzySearch_VM_DataDesigner</b>
			   <div class="spoiler-wrap">
				   <div class="spoiler-head folded clickable">Кликните здесь для просмотра всего текста</div>
				   <div class="spoiler-body">
					   <div class="codeblock"><table class="csharp"><thead><tr><td colspan="2" id="513355386"  class="head">C#</td></tr></thead><tbody><tr class="li1"><td><div id="513355386" style="height: 350px" class="codeframe"><table><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
</pre></td><td class="de1"><pre class="de1">&nbsp; &nbsp; <span class="co1">/// &lt;summary&gt;Класс ViewModel for DesignData&lt;/summary&gt;</span>
&nbsp; &nbsp; <span class="kw1">public</span> <span class="kw4">class</span> FuzzySearch_VM_DataDesigner <span class="sy0">:</span> OnPropertyChangedClass
&nbsp; &nbsp; <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co2">#region Свойства для привязки элементов отображения</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">/// &lt;summary&gt;Свойство для слова поиска&lt;/summary&gt;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">public</span> <span class="kw4">string</span> TextSearch <span class="br0">&#123;</span> <span class="kw1">get</span> <span class="sy0">=&gt;</span> _textSearch<span class="sy0">;</span> <span class="kw1">set</span> <span class="br0">&#123;</span> _textSearch <span class="sy0">=</span> <span class="kw1">value</span><span class="sy0">;</span> OnAllPropertyChanged<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span> <span class="br0">&#125;</span> <span class="br0">&#125;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">/// &lt;summary&gt;Свойство для слова добавления&lt;/summary&gt;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">public</span> <span class="kw4">string</span> TextAdd <span class="br0">&#123;</span> <span class="kw1">get</span> <span class="sy0">=&gt;</span> _textAdd<span class="sy0">;</span> <span class="kw1">set</span> <span class="br0">&#123;</span> _textAdd <span class="sy0">=</span> <span class="kw1">value</span><span class="sy0">;</span> OnAllPropertyChanged<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span> <span class="br0">&#125;</span> <span class="br0">&#125;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">/// &lt;summary&gt;Свойство для списка слова&lt;/summary&gt;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">public</span> ObservableCollection<span class="sy0">&lt;</span><span class="kw4">string</span><span class="sy0">&gt;</span> ListWords <span class="br0">&#123;</span> <span class="kw1">get</span> <span class="sy0">=&gt;</span> _listWords<span class="sy0">;</span> <span class="kw1">set</span> <span class="br0">&#123;</span> _listWords <span class="sy0">=</span> <span class="kw1">value</span><span class="sy0">;</span> OnAllPropertyChanged<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span> <span class="br0">&#125;</span> <span class="br0">&#125;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">/// &lt;summary&gt;Свойство для сообщения с результатами поиска&lt;/summary&gt;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">public</span> <span class="kw4">string</span> TextMessage <span class="br0">&#123;</span> <span class="kw1">get</span> <span class="sy0">=&gt;</span> _textMessage<span class="sy0">;</span> <span class="kw1">set</span> <span class="br0">&#123;</span> _textMessage <span class="sy0">=</span> <span class="kw1">value</span><span class="sy0">;</span> OnAllPropertyChanged<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span> <span class="br0">&#125;</span> <span class="br0">&#125;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co2">#endregion</span>
&nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co2">#region Приватные поля</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// Поля для хранения значения свойства</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">private</span> <span class="kw4">string</span> _textSearch<span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">private</span> <span class="kw4">string</span> _textAdd<span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">private</span> ObservableCollection<span class="sy0">&lt;</span><span class="kw4">string</span><span class="sy0">&gt;</span> _listWords<span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">private</span> <span class="kw4">string</span> _textMessage<span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// Поля для хранения значения команд</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">private</span> ICommand _searchComm<span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">private</span> ICommand _clearComm<span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">private</span> ICommand _addComm<span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">private</span> ICommand _saveComm<span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">private</span> ICommand _loadComm<span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co2">#endregion</span>
&nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co2">#region Свойства для привязки команд</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">/// &lt;summary&gt;Свойство для привязки команды&lt;/summary&gt;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">public</span> ICommand SearchComm <span class="sy0">=&gt;</span> _searchComm <span class="sy0">??</span> <span class="br0">&#40;</span>_searchComm <span class="sy0">=</span> <span class="kw3">new</span> RelayCommand<span class="br0">&#40;</span>OnSearch<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">/// &lt;summary&gt;Свойство для привязки команды&lt;/summary&gt;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">public</span> ICommand ClearComm <span class="sy0">=&gt;</span> _clearComm <span class="sy0">??</span> <span class="br0">&#40;</span>_clearComm <span class="sy0">=</span> <span class="kw3">new</span> RelayCommand<span class="br0">&#40;</span>OnClear<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">/// &lt;summary&gt;Свойство для привязки команды&lt;/summary&gt;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">public</span> ICommand AddComm <span class="sy0">=&gt;</span> _addComm <span class="sy0">??</span> <span class="br0">&#40;</span>_addComm <span class="sy0">=</span> <span class="kw3">new</span> RelayCommand<span class="br0">&#40;</span>OnAdd<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">/// &lt;summary&gt;Свойство для привязки команды&lt;/summary&gt;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">public</span> ICommand SaveComm <span class="sy0">=&gt;</span> _saveComm <span class="sy0">??</span> <span class="br0">&#40;</span>_saveComm <span class="sy0">=</span> <span class="kw3">new</span> RelayCommand<span class="br0">&#40;</span>OnSave<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">/// &lt;summary&gt;Свойство для привязки команды&lt;/summary&gt;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">public</span> ICommand LoadComm <span class="sy0">=&gt;</span> _loadComm <span class="sy0">??</span> <span class="br0">&#40;</span>_loadComm <span class="sy0">=</span> <span class="kw3">new</span> RelayCommand<span class="br0">&#40;</span>OnLoad<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co2">#endregion</span>
&nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co2">#region Методы для команд</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">/// &lt;summary&gt;Метод для вызова из команды&lt;/summary&gt;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">/// &lt;param name=&quot;Value&quot;&gt;Значение привязанного параметра&lt;/param&gt;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">public</span> <span class="kw1">virtual</span> <span class="kw4">void</span> OnSearch<span class="br0">&#40;</span><span class="kw4">object</span> <span class="kw1">Value</span> <span class="sy0">=</span> <span class="kw1">null</span><span class="br0">&#41;</span> <span class="br0">&#123;</span> <span class="br0">&#125;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">/// &lt;summary&gt;Метод для вызова из команды&lt;/summary&gt;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">/// &lt;param name=&quot;Value&quot;&gt;Значение привязанного параметра&lt;/param&gt;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">public</span> <span class="kw1">virtual</span> <span class="kw4">void</span> OnClear<span class="br0">&#40;</span><span class="kw4">object</span> <span class="kw1">Value</span> <span class="sy0">=</span> <span class="kw1">null</span><span class="br0">&#41;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span> TextSearch <span class="sy0">=</span> <span class="st0">&quot;&quot;</span><span class="sy0">;</span> TextMessage <span class="sy0">=</span> <span class="st0">&quot;&quot;</span><span class="sy0">;</span> TextAdd <span class="sy0">=</span> <span class="st0">&quot;&quot;</span><span class="sy0">;</span> <span class="br0">&#125;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">/// &lt;summary&gt;Метод для вызова из команды&lt;/summary&gt;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">/// &lt;param name=&quot;Value&quot;&gt;Значение привязанного параметра&lt;/param&gt;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">public</span> <span class="kw1">virtual</span> <span class="kw4">void</span> OnAdd<span class="br0">&#40;</span><span class="kw4">object</span> <span class="kw1">Value</span> <span class="sy0">=</span> <span class="kw1">null</span><span class="br0">&#41;</span> <span class="br0">&#123;</span> <span class="br0">&#125;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">/// &lt;summary&gt;Метод для вызова из команды&lt;/summary&gt;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">/// &lt;param name=&quot;Value&quot;&gt;Значение привязанного параметра&lt;/param&gt;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">public</span> <span class="kw1">virtual</span> <span class="kw4">void</span> OnSave<span class="br0">&#40;</span><span class="kw4">object</span> <span class="kw1">Value</span> <span class="sy0">=</span> <span class="kw1">null</span><span class="br0">&#41;</span> <span class="br0">&#123;</span> <span class="br0">&#125;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">/// &lt;summary&gt;Метод для вызова из команды&lt;/summary&gt;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">/// &lt;param name=&quot;Value&quot;&gt;Значение привязанного параметра&lt;/param&gt;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">public</span> <span class="kw1">virtual</span> <span class="kw4">void</span> OnLoad<span class="br0">&#40;</span><span class="kw4">object</span> <span class="kw1">Value</span> <span class="sy0">=</span> <span class="kw1">null</span><span class="br0">&#41;</span> <span class="br0">&#123;</span> <span class="br0">&#125;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co2">#endregion</span>
&nbsp; &nbsp; <span class="br0">&#125;</span></pre></td></tr></table></div></td></tr></tbody></table></div>
				   </div>
			   </div>Заполняя данными <b>VMDD </b>в <b>Xaml </b>окна - используем префикс <b>d:</b>, который сообщает компилятору, что это данные времени разработки и компилировать в сборку их не надо. Для развитой <b>VMDD</b> для отладки <b>View</b> временно убирается префикс <b>d:</b> и исполняется проект. <b>View </b>должна быть полностью рабочей для такого исполнения! Допустим, в нашем случае, запуская окно мы можем изменять его размеры и видеть как адаптируются размеры элементов под размеры окна. Исходя из этого мы можем ограничить максимальные или минимальные размеры окна.<div class="codeblock"><table class="xml"><thead><tr><td colspan="2" id="314299054"  class="head">XML</td></tr></thead><tbody><tr class="li1"><td><div id="314299054" style="height: 174px" class="codeframe"><table><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">1
2
3
4
5
6
7
8
9
</pre></td><td class="de1"><pre class="de1">&nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;d:Window.DataContext<span class="re2">&gt;</span></span></span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;local:FuzzySearch_VM_DataDesigner</span> <span class="re0">TextSearch</span>=<span class="st0">&quot;Слово для поиска&quot;</span> <span class="re0">TextAdd</span>=<span class="st0">&quot;Слово для добавления&quot;</span> <span class="re0">TextMessage</span>=<span class="st0">&quot;Сообщение&quot;</span><span class="re2">&gt;</span></span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;local:FuzzySearch_VM_DataDesigner.ListWords<span class="re2">&gt;</span></span></span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;sys:String<span class="re2">&gt;</span></span></span>Анекдоты<span class="sc3"><span class="re1">&lt;/sys:String<span class="re2">&gt;</span></span></span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;sys:String<span class="re2">&gt;</span></span></span>про<span class="sc3"><span class="re1">&lt;/sys:String<span class="re2">&gt;</span></span></span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;sys:String<span class="re2">&gt;</span></span></span>Вовочку<span class="sc3"><span class="re1">&lt;/sys:String<span class="re2">&gt;</span></span></span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;/local:FuzzySearch_VM_DataDesigner.ListWords<span class="re2">&gt;</span></span></span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;/local:FuzzySearch_VM_DataDesigner<span class="re2">&gt;</span></span></span>
&nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;/d:Window.DataContext<span class="re2">&gt;</span></span></span></pre></td></tr></table></div></td></tr></tbody></table></div>Теперь можно удобно создавать<b> WPF View</b>. Одна из частых ошибок для начинающих, особенно тех кто до этого работал в <b>WinForms</b>, &quot;жёстко&quot; позиционировать элементы с помощью свойств <b>Margin </b>и размера элементов. Для <b>WPF </b>такое НЕПРИЕМЛЕМО! <b>Margin </b>это свойство для задания расстояния между элементами, а не их позиции. Для компоновки элементов надо использовать различные типы контейнеров.<br />
Для компоновки, в данном случае, хватает комбинации панелей <b>Grid</b> и <b>StackPanel</b>. Все элементы сразу привязываем к данным. Так как у нас есть заполненная <b>VMDD</b>, то в конструкторе всплывают свойства <b>VMDD</b> и в элементах сразу отображаются значения этих свойств.<br />
<b>Xaml</b> элементов окна 
			   <div class="spoiler-wrap">
				   <div class="spoiler-head folded clickable">Кликните здесь для просмотра всего текста</div>
				   <div class="spoiler-body">
					   <div class="codeblock"><table class="xml"><thead><tr><td colspan="2" id="171608885"  class="head">XML</td></tr></thead><tbody><tr class="li1"><td><div id="171608885" style="height: 350px" class="codeframe"><table><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
</pre></td><td class="de1"><pre class="de1">&nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;Grid</span> <span class="re0">x:Name</span>=<span class="st0">&quot;Can1&quot;</span> <span class="re0">ShowGridLines</span>=<span class="st0">&quot;False&quot;</span> <span class="re0">Background</span>=<span class="st0">&quot;Aqua&quot;</span><span class="re2">&gt;</span></span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;Grid.RowDefinitions<span class="re2">&gt;</span></span></span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;RowDefinition</span> <span class="re0">Height</span>=<span class="st0">&quot;Auto&quot;</span><span class="re2">/&gt;</span></span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;RowDefinition</span><span class="re2">/&gt;</span></span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;RowDefinition</span> <span class="re0">Height</span>=<span class="st0">&quot;Auto&quot;</span><span class="re2">/&gt;</span></span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;/Grid.RowDefinitions<span class="re2">&gt;</span></span></span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;Grid.ColumnDefinitions<span class="re2">&gt;</span></span></span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;ColumnDefinition</span><span class="re2">/&gt;</span></span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;ColumnDefinition</span><span class="re2">/&gt;</span></span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;ColumnDefinition</span><span class="re2">/&gt;</span></span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;/Grid.ColumnDefinitions<span class="re2">&gt;</span></span></span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;StackPanel<span class="re2">&gt;</span></span></span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;TextBox</span> <span class="re0">TextWrapping</span>=<span class="st0">&quot;Wrap&quot;</span> <span class="re0">Text</span>=<span class="st0">&quot;{Binding TextSearch}&quot;</span> <span class="re0">Margin</span>=<span class="st0">&quot;10&quot;</span><span class="re2">/&gt;</span></span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;Button</span> <span class="re0">Content</span>=<span class="st0">&quot;Поиск&quot;</span> &nbsp;<span class="re0">VerticalAlignment</span>=<span class="st0">&quot;Bottom&quot;</span> <span class="re0">Margin</span>=<span class="st0">&quot;10&quot;</span> <span class="re0">Command</span>=<span class="st0">&quot;{Binding SearchComm}&quot;</span><span class="re2">/&gt;</span></span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;/StackPanel<span class="re2">&gt;</span></span></span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;TextBlock</span> <span class="re0">Grid.Column</span>=<span class="st0">&quot;1&quot;</span> <span class="re0">Margin</span>=<span class="st0">&quot;10&quot;</span> <span class="re0">TextWrapping</span>=<span class="st0">&quot;Wrap&quot;</span> <span class="re0">Background</span>=<span class="st0">&quot;White&quot;</span> <span class="re0">Text</span>=<span class="st0">&quot;{Binding TextMessage}&quot;</span><span class="re2">/&gt;</span></span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;TextBox</span> <span class="re0">TextWrapping</span>=<span class="st0">&quot;Wrap&quot;</span> <span class="re0">Text</span>=<span class="st0">&quot;{Binding TextAdd}&quot;</span> <span class="re0">Margin</span>=<span class="st0">&quot;10&quot;</span> <span class="re0">Grid.Row</span>=<span class="st0">&quot;2&quot;</span><span class="re2">/&gt;</span></span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;ListBox</span> <span class="re0">Margin</span>=<span class="st0">&quot;10&quot;</span> <span class="re0">Grid.Row</span>=<span class="st0">&quot;1&quot;</span> <span class="re0">MinHeight</span>=<span class="st0">&quot;20&quot;</span> <span class="re0">Grid.ColumnSpan</span>=<span class="st0">&quot;3&quot;</span> <span class="re0">ItemsSource</span>=<span class="st0">&quot;{Binding ListWords}&quot;</span><span class="re2">/&gt;</span></span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;Button</span> &nbsp;<span class="re0">Content</span>=<span class="st0">&quot;Очистить&quot;</span> &nbsp;<span class="re0">VerticalAlignment</span>=<span class="st0">&quot;Bottom&quot;</span> <span class="re0">Margin</span>=<span class="st0">&quot;10&quot;</span> <span class="re0">Grid.Row</span>=<span class="st0">&quot;0&quot;</span> <span class="re0">Grid.Column</span>=<span class="st0">&quot;2&quot;</span> <span class="re0">Command</span>=<span class="st0">&quot;{Binding ClearComm}&quot;</span><span class="re2">/&gt;</span></span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;Button</span> <span class="re0">Content</span>=<span class="st0">&quot;Добавить&quot;</span> &nbsp;<span class="re0">VerticalAlignment</span>=<span class="st0">&quot;Center&quot;</span> <span class="re0">Margin</span>=<span class="st0">&quot;10&quot;</span> <span class="re0">Grid.Row</span>=<span class="st0">&quot;2&quot;</span> <span class="re0">Grid.Column</span>=<span class="st0">&quot;1&quot;</span> <span class="re0">Command</span>=<span class="st0">&quot;{Binding AddComm}&quot;</span><span class="re2">/&gt;</span></span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;StackPanel</span> <span class="re0">Grid.Row</span>=<span class="st0">&quot;2&quot;</span> <span class="re0">Grid.Column</span>=<span class="st0">&quot;2&quot;</span><span class="re2">&gt;</span></span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;Button</span> <span class="re0">Content</span>=<span class="st0">&quot;Загрузить&quot;</span> <span class="re0">Margin</span>=<span class="st0">&quot;10&quot;</span> <span class="re0">Command</span>=<span class="st0">&quot;{Binding LoadComm}&quot;</span><span class="re2">/&gt;</span></span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;Button</span> <span class="re0">Content</span>=<span class="st0">&quot;Сохранить&quot;</span> <span class="re0">Margin</span>=<span class="st0">&quot;10&quot;</span> <span class="re0">Command</span>=<span class="st0">&quot;{Binding SaveComm}&quot;</span><span class="re2">/&gt;</span></span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;/StackPanel<span class="re2">&gt;</span></span></span>
&nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;/Grid<span class="re2">&gt;</span></span></span></pre></td></tr></table></div></td></tr></tbody></table></div>
				   </div>
			   </div><br />
После создания <b>View</b> надо создать реальную <b>VM</b>. В ней нужно прописать связь с <b>Моделью</b>. Так как у нас уже есть <b>VMDD</b>, то <b>VM</b> будем наследовать от неё. Нам понадобится прописать в конструкторе инициализацию <b>Модели</b> и свойства для списка слов и переопределить методы для кнопок.<br />
Класс <b>VM</b> - <b>FuzzySearch_VM</b>
			   <div class="spoiler-wrap">
				   <div class="spoiler-head folded clickable">Кликните здесь для просмотра всего текста</div>
				   <div class="spoiler-body">
					   <div class="codeblock"><table class="csharp"><thead><tr><td colspan="2" id="244958521"  class="head">C#</td></tr></thead><tbody><tr class="li1"><td><div id="244958521" style="height: 254px" class="codeframe"><table><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">1
2
3
4
5
6
7
8
9
10
11
12
13
14
</pre></td><td class="de1"><pre class="de1">&nbsp; &nbsp; <span class="co1">/// &lt;summary&gt;Класс реальной ViewModel&lt;/summary&gt;</span>
&nbsp; &nbsp; <span class="kw1">public</span> <span class="kw4">class</span> FuzzySearch_VM <span class="sy0">:</span> FuzzySearch_VM_DataDesigner
&nbsp; &nbsp; <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">public</span> FuzzySearch_VM<span class="br0">&#40;</span><span class="br0">&#41;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; FuzzySearch_Model<span class="sy0">.</span><span class="me1">Load</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ListWords <span class="sy0">=</span> FuzzySearch_Model<span class="sy0">.</span><span class="me1">ListWords</span><span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>
&nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">public</span> <span class="kw1">override</span> <span class="kw4">void</span> OnAdd<span class="br0">&#40;</span><span class="kw4">object</span> <span class="kw1">Value</span> <span class="sy0">=</span> <span class="kw1">null</span><span class="br0">&#41;</span> <span class="sy0">=&gt;</span> FuzzySearch_Model<span class="sy0">.</span><span class="me1">AddWord</span><span class="br0">&#40;</span>TextAdd<span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">public</span> <span class="kw1">override</span> <span class="kw4">void</span> OnLoad<span class="br0">&#40;</span><span class="kw4">object</span> <span class="kw1">Value</span> <span class="sy0">=</span> <span class="kw1">null</span><span class="br0">&#41;</span> <span class="sy0">=&gt;</span> FuzzySearch_Model<span class="sy0">.</span><span class="me1">Load</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">public</span> <span class="kw1">override</span> <span class="kw4">void</span> OnSave<span class="br0">&#40;</span><span class="kw4">object</span> <span class="kw1">Value</span> <span class="sy0">=</span> <span class="kw1">null</span><span class="br0">&#41;</span> <span class="sy0">=&gt;</span> FuzzySearch_Model<span class="sy0">.</span><span class="me1">Save</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">public</span> <span class="kw1">override</span> <span class="kw4">void</span> OnSearch<span class="br0">&#40;</span><span class="kw4">object</span> <span class="kw1">Value</span> <span class="sy0">=</span> <span class="kw1">null</span><span class="br0">&#41;</span> <span class="sy0">=&gt;</span> TextMessage <span class="sy0">=</span> FuzzySearch_Model<span class="sy0">.</span><span class="me1">SearchWord</span><span class="br0">&#40;</span>TextSearch<span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp; &nbsp; <span class="br0">&#125;</span></pre></td></tr></table></div></td></tr></tbody></table></div>
				   </div>
			   </div><br />
Теперь осталось только подключить <b>VM</b> к <b>View</b><div class="codeblock"><table class="xml"><thead><tr><td colspan="2" id="928748472"  class="head">XML</td></tr></thead><tbody><tr class="li1"><td><div id="928748472" style="height: 78px" class="codeframe"><table><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">1
2
3
</pre></td><td class="de1"><pre class="de1">&nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;Window.DataContext<span class="re2">&gt;</span></span></span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;local:FuzzySearch_VM</span><span class="re2">/&gt;</span></span>
&nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;/Window.DataContext<span class="re2">&gt;</span></span></span></pre></td></tr></table></div></td></tr></tbody></table></div><b>На этом всё - наше WPF приложение в паттерне MVVM создано!</b><br />
Архив проекта - приложен.</div>


<!-- attachments -->
	<div style="margin-top:10px">

		
		
		
		
			<fieldset class="fieldset">
				<legend>Вложения</legend>
				<table cellpadding="0" cellspacing="3" border="0">
				<tr>
	<td><img loading="lazy" decoding="async" class="inlineimg" src="http://www.cyberforum.ru//cyberstatic.net/images/attach/7z.gif" alt="Тип файла: 7z" width="16" height="16" border="0" style="vertical-align:baseline" /></td>
	<td><a href="https://www.cyberforum.ru/blog_attachment.php?attachmentid=5152&amp;d=1545793104">FuzzySearch.7z</a> (28.3 Кб, 622 просмотров)</td>
</tr>
				</table>
			</fieldset>
		

	</div>
<!-- / attachments -->
]]></content:encoded>
			<dc:creator>Элд Хасп</dc:creator>
			<guid isPermaLink="true">https://www.cyberforum.ru/blogs/1297115/5602.html</guid>
		</item>
		<item>
			<title>Изменение цвета рамок при фокусировке - на примере TextBox (WPF)</title>
			<link>https://www.cyberforum.ru/blogs/1297115/5553.html</link>
			<pubDate>Sat, 24 Nov 2018 06:13:57 GMT</pubDate>
			<description>Решение по вопросам тем TextBox запретить изменение цвета BorderBrush...</description>
			<content:encoded><![CDATA[<div>Решение по вопросам тем <a href="https://www.cyberforum.ru/wpf-silverlight/thread2351583.html">TextBox запретить изменение цвета BorderBrush</a>, <a href="https://www.cyberforum.ru/wpf-silverlight/thread1513854.html">Убрать рамочку вокруг textbox</a><br />
Вопрос в том, как поменять цвет рамки или убрать рамку TextBox при фокусировке. В невыделанном состоянии для рамки используется кисть из свойства <b>TextBox.BorderBrush</b>. Но при выделении  (<b>Focus</b> или <b>MouseOver</b>) используемые кисти недоступны.<br />
Есть несколько способов решения этого вопроса. В основном предлагается переопределение шаблона с использование триггеров. <br />
Я предлагаю внесением изменений в дефолтный шаблон сделать доступными для изменения кисти для рамок.<br />
<br />
Рассмотрим дефолтный шаблон TextBox
			   <div class="spoiler-wrap">
				   <div class="spoiler-head folded clickable">Кликните здесь для просмотра всего текста</div>
				   <div class="spoiler-body">
					   <div class="codeblock"><table class="xml"><thead><tr><td colspan="2" id="887020342"  class="head">XML</td></tr></thead><tbody><tr class="li1"><td><div id="887020342" style="height: 350px" class="codeframe"><table><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
</pre></td><td class="de1"><pre class="de1">&nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;Window.Resources<span class="re2">&gt;</span></span></span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;SolidColorBrush</span> <span class="re0">x:Key</span>=<span class="st0">&quot;TextBox.Static.Border&quot;</span> <span class="re0">Color</span>=<span class="st0">&quot;#FFABAdB3&quot;</span><span class="re2">/&gt;</span></span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;SolidColorBrush</span> <span class="re0">x:Key</span>=<span class="st0">&quot;TextBox.MouseOver.Border&quot;</span> <span class="re0">Color</span>=<span class="st0">&quot;#FF7EB4EA&quot;</span><span class="re2">/&gt;</span></span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;SolidColorBrush</span> <span class="re0">x:Key</span>=<span class="st0">&quot;TextBox.Focus.Border&quot;</span> <span class="re0">Color</span>=<span class="st0">&quot;#FF569DE5&quot;</span><span class="re2">/&gt;</span></span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;Style</span> <span class="re0">TargetType</span>=<span class="st0">&quot;{x:Type TextBox}&quot;</span><span class="re2">&gt;</span></span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;Setter</span> <span class="re0">Property</span>=<span class="st0">&quot;Background&quot;</span> <span class="re0">Value</span>=<span class="st0">&quot;{DynamicResource {x:Static SystemColors.WindowBrushKey}}&quot;</span><span class="re2">/&gt;</span></span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;Setter</span> <span class="re0">Property</span>=<span class="st0">&quot;BorderBrush&quot;</span> <span class="re0">Value</span>=<span class="st0">&quot;{StaticResource TextBox.Static.Border}&quot;</span><span class="re2">/&gt;</span></span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;Setter</span> <span class="re0">Property</span>=<span class="st0">&quot;Foreground&quot;</span> <span class="re0">Value</span>=<span class="st0">&quot;{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}&quot;</span><span class="re2">/&gt;</span></span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;Setter</span> <span class="re0">Property</span>=<span class="st0">&quot;BorderThickness&quot;</span> <span class="re0">Value</span>=<span class="st0">&quot;1&quot;</span><span class="re2">/&gt;</span></span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;Setter</span> <span class="re0">Property</span>=<span class="st0">&quot;KeyboardNavigation.TabNavigation&quot;</span> <span class="re0">Value</span>=<span class="st0">&quot;None&quot;</span><span class="re2">/&gt;</span></span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;Setter</span> <span class="re0">Property</span>=<span class="st0">&quot;HorizontalContentAlignment&quot;</span> <span class="re0">Value</span>=<span class="st0">&quot;Left&quot;</span><span class="re2">/&gt;</span></span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;Setter</span> <span class="re0">Property</span>=<span class="st0">&quot;FocusVisualStyle&quot;</span> <span class="re0">Value</span>=<span class="st0">&quot;{x:Null}&quot;</span><span class="re2">/&gt;</span></span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;Setter</span> <span class="re0">Property</span>=<span class="st0">&quot;AllowDrop&quot;</span> <span class="re0">Value</span>=<span class="st0">&quot;true&quot;</span><span class="re2">/&gt;</span></span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;Setter</span> <span class="re0">Property</span>=<span class="st0">&quot;ScrollViewer.PanningMode&quot;</span> <span class="re0">Value</span>=<span class="st0">&quot;VerticalFirst&quot;</span><span class="re2">/&gt;</span></span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;Setter</span> <span class="re0">Property</span>=<span class="st0">&quot;Stylus.IsFlicksEnabled&quot;</span> <span class="re0">Value</span>=<span class="st0">&quot;False&quot;</span><span class="re2">/&gt;</span></span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;Setter</span> <span class="re0">Property</span>=<span class="st0">&quot;Template&quot;</span><span class="re2">&gt;</span></span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;Setter.Value<span class="re2">&gt;</span></span></span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;ControlTemplate</span> <span class="re0">TargetType</span>=<span class="st0">&quot;{x:Type TextBox}&quot;</span><span class="re2">&gt;</span></span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;Border</span> <span class="re0">x:Name</span>=<span class="st0">&quot;border&quot;</span> <span class="re0">BorderBrush</span>=<span class="st0">&quot;{TemplateBinding BorderBrush}&quot;</span> <span class="re0">BorderThickness</span>=<span class="st0">&quot;{TemplateBinding BorderThickness}&quot;</span> <span class="re0">Background</span>=<span class="st0">&quot;{TemplateBinding Background}&quot;</span> <span class="re0">SnapsToDevicePixels</span>=<span class="st0">&quot;True&quot;</span><span class="re2">&gt;</span></span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;ScrollViewer</span> <span class="re0">x:Name</span>=<span class="st0">&quot;PART_ContentHost&quot;</span> <span class="re0">Focusable</span>=<span class="st0">&quot;false&quot;</span> <span class="re0">HorizontalScrollBarVisibility</span>=<span class="st0">&quot;Hidden&quot;</span> <span class="re0">VerticalScrollBarVisibility</span>=<span class="st0">&quot;Hidden&quot;</span><span class="re2">/&gt;</span></span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;/Border<span class="re2">&gt;</span></span></span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;ControlTemplate.Triggers<span class="re2">&gt;</span></span></span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;Trigger</span> <span class="re0">Property</span>=<span class="st0">&quot;IsEnabled&quot;</span> <span class="re0">Value</span>=<span class="st0">&quot;false&quot;</span><span class="re2">&gt;</span></span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;Setter</span> <span class="re0">Property</span>=<span class="st0">&quot;Opacity&quot;</span> <span class="re0">TargetName</span>=<span class="st0">&quot;border&quot;</span> <span class="re0">Value</span>=<span class="st0">&quot;0.56&quot;</span><span class="re2">/&gt;</span></span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;/Trigger<span class="re2">&gt;</span></span></span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;Trigger</span> <span class="re0">Property</span>=<span class="st0">&quot;IsMouseOver&quot;</span> <span class="re0">Value</span>=<span class="st0">&quot;true&quot;</span><span class="re2">&gt;</span></span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;Setter</span> <span class="re0">Property</span>=<span class="st0">&quot;BorderBrush&quot;</span> <span class="re0">TargetName</span>=<span class="st0">&quot;border&quot;</span> <span class="re0">Value</span>=<span class="st0">&quot;{StaticResource TextBox.MouseOver.Border}&quot;</span><span class="re2">/&gt;</span></span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;/Trigger<span class="re2">&gt;</span></span></span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;Trigger</span> <span class="re0">Property</span>=<span class="st0">&quot;IsKeyboardFocused&quot;</span> <span class="re0">Value</span>=<span class="st0">&quot;true&quot;</span><span class="re2">&gt;</span></span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;Setter</span> <span class="re0">Property</span>=<span class="st0">&quot;BorderBrush&quot;</span> <span class="re0">TargetName</span>=<span class="st0">&quot;border&quot;</span> <span class="re0">Value</span>=<span class="st0">&quot;{StaticResource TextBox.Focus.Border}&quot;</span><span class="re2">/&gt;</span></span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;/Trigger<span class="re2">&gt;</span></span></span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;/ControlTemplate.Triggers<span class="re2">&gt;</span></span></span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;/ControlTemplate<span class="re2">&gt;</span></span></span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;/Setter.Value<span class="re2">&gt;</span></span></span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;/Setter<span class="re2">&gt;</span></span></span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;Style.Triggers<span class="re2">&gt;</span></span></span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;MultiTrigger<span class="re2">&gt;</span></span></span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;MultiTrigger.Conditions<span class="re2">&gt;</span></span></span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;Condition</span> <span class="re0">Property</span>=<span class="st0">&quot;IsInactiveSelectionHighlightEnabled&quot;</span> <span class="re0">Value</span>=<span class="st0">&quot;true&quot;</span><span class="re2">/&gt;</span></span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;Condition</span> <span class="re0">Property</span>=<span class="st0">&quot;IsSelectionActive&quot;</span> <span class="re0">Value</span>=<span class="st0">&quot;false&quot;</span><span class="re2">/&gt;</span></span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;/MultiTrigger.Conditions<span class="re2">&gt;</span></span></span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;Setter</span> <span class="re0">Property</span>=<span class="st0">&quot;SelectionBrush&quot;</span> <span class="re0">Value</span>=<span class="st0">&quot;{DynamicResource {x:Static SystemColors.InactiveSelectionHighlightBrushKey}}&quot;</span><span class="re2">/&gt;</span></span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;/MultiTrigger<span class="re2">&gt;</span></span></span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;/Style.Triggers<span class="re2">&gt;</span></span></span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;/Style<span class="re2">&gt;</span></span></span>
&nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;/Window.Resources<span class="re2">&gt;</span></span></span></pre></td></tr></table></div></td></tr></tbody></table></div>
				   </div>
			   </div>Рамку при наведении мыши определяют теги 26-28 строк, клавиатуры - строки 29-31. Цвет рамки для мыши определяет ресурс <b>TextBox.MouseOver.Border</b>, клавиатуры - <b>TextBox.Focus.Border</b>. Обе привязки к ресурсу статические - то есть, после инициализации шаблона их изменить нельзя. <br />
Что бы стало возможно в определении TextBox менять эти ресурсы, изменим привязки на динамические<div class="codeblock"><table class="xml"><thead><tr><td colspan="2" id="959551549"  class="head">XML</td></tr></thead><tbody><tr class="li1"><td><div id="959551549" style="height: 126px" class="codeframe"><table><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">26
27
28
29
30
31
</pre></td><td class="de1"><pre class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;Trigger</span> <span class="re0">Property</span>=<span class="st0">&quot;IsMouseOver&quot;</span> <span class="re0">Value</span>=<span class="st0">&quot;true&quot;</span><span class="re2">&gt;</span></span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;Setter</span> <span class="re0">Property</span>=<span class="st0">&quot;BorderBrush&quot;</span> <span class="re0">TargetName</span>=<span class="st0">&quot;border&quot;</span> <span class="re0">Value</span>=<span class="st0">&quot;{DynamicResource TextBox.MouseOver.Border}&quot;</span><span class="re2">/&gt;</span></span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;/Trigger<span class="re2">&gt;</span></span></span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;Trigger</span> <span class="re0">Property</span>=<span class="st0">&quot;IsKeyboardFocused&quot;</span> <span class="re0">Value</span>=<span class="st0">&quot;true&quot;</span><span class="re2">&gt;</span></span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;Setter</span> <span class="re0">Property</span>=<span class="st0">&quot;BorderBrush&quot;</span> <span class="re0">TargetName</span>=<span class="st0">&quot;border&quot;</span> <span class="re0">Value</span>=<span class="st0">&quot;{DynamicResource TextBox.Focus.Border}&quot;</span><span class="re2">/&gt;</span></span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;/Trigger<span class="re2">&gt;</span></span></span></pre></td></tr></table></div></td></tr></tbody></table></div>Теперь мы можем устанавливать цвет рамки для любого режима. Если какая-то рамка не нужна, надо установить её цвет &quot;<b>Transparent</b>&quot;. В примере устанавливаются цвета: для обычного состояния - <b>Green</b>, при наведении мыши - <b>Red</b>, при клавиатурном фокусе - <b>Yellow</b><div class="codeblock"><table class="xml"><thead><tr><td colspan="2" id="885133905"  class="head">XML</td></tr></thead><tbody><tr class="li1"><td><div id="885133905" style="height: 126px" class="codeframe"><table><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">1
2
3
4
5
6
</pre></td><td class="de1"><pre class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;TextBox</span> <span class="re0">VerticalAlignment</span>=<span class="st0">&quot;Center&quot;</span> <span class="re0">HorizontalAlignment</span>=<span class="st0">&quot;Center&quot;</span> <span class="re0">BorderBrush</span>=<span class="st0">&quot;Green&quot;</span> <span class="re0">Text</span>=<span class="st0">&quot;Пример текста&quot;</span><span class="re2">&gt;</span></span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;TextBox.Resources<span class="re2">&gt;</span></span></span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;SolidColorBrush</span> <span class="re0">x:Key</span>=<span class="st0">&quot;TextBox.MouseOver.Border&quot;</span> <span class="re0">Color</span>=<span class="st0">&quot;Red&quot;</span><span class="re2">/&gt;</span></span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;SolidColorBrush</span> <span class="re0">x:Key</span>=<span class="st0">&quot;TextBox.Focus.Border&quot;</span> <span class="re0">Color</span>=<span class="st0">&quot;Yellow&quot;</span><span class="re2">/&gt;</span></span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;/TextBox.Resources<span class="re2">&gt;</span></span></span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;/TextBox<span class="re2">&gt;</span></span></span></pre></td></tr></table></div></td></tr></tbody></table></div>Сам переопределённый шаблон и сопутствующие ресурсы лучше прописать в словаре, чтобы не загромождать Xaml окна. Словарь, в зависимости от необходимости, подключить на уровне окна или приложения.<br />
Ниже полный Xaml примера с определением шаблона в ресурсах окна и двумя TextBox - один без рамок.<div class="codeblock"><table class="xml"><thead><tr><td colspan="2" id="365630872"  class="head">XML</td></tr></thead><tbody><tr class="li1"><td><div id="365630872" style="height: 350px" class="codeframe"><table><tr class="li1"><td class="ln" style="padding: 0px 10px 0px 5px;"><pre class="de1">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
</pre></td><td class="de1"><pre class="de1"><span class="sc3"><span class="re1">&lt;Window</span> <span class="re0">x:Class</span>=<span class="st0">&quot;Cs_WPF.TextBoxTemplate__1513854_2351583_&quot;</span></span>
<span class="sc3"> &nbsp; &nbsp; &nbsp; &nbsp;<span class="re0">xmlns</span>=<span class="st0">&quot;http://schemas.microsoft.com/winfx/2006/xaml/presentation&quot;</span></span>
<span class="sc3"> &nbsp; &nbsp; &nbsp; &nbsp;<span class="re0">xmlns:x</span>=<span class="st0">&quot;http://schemas.microsoft.com/winfx/2006/xaml&quot;</span></span>
<span class="sc3"> &nbsp; &nbsp; &nbsp; &nbsp;<span class="re0">xmlns:d</span>=<span class="st0">&quot;http://schemas.microsoft.com/expression/blend/2008&quot;</span></span>
<span class="sc3"> &nbsp; &nbsp; &nbsp; &nbsp;<span class="re0">xmlns:mc</span>=<span class="st0">&quot;http://schemas.openxmlformats.org/markup-compatibility/2006&quot;</span></span>
<span class="sc3"> &nbsp; &nbsp; &nbsp; &nbsp;<span class="re0">xmlns:local</span>=<span class="st0">&quot;clr-namespace:Cs_WPF&quot;</span></span>
<span class="sc3"> &nbsp; &nbsp; &nbsp; &nbsp;<span class="re0">mc:Ignorable</span>=<span class="st0">&quot;d&quot;</span></span>
<span class="sc3"> &nbsp; &nbsp; &nbsp; &nbsp;<span class="re0">Title</span>=<span class="st0">&quot;TextBoxTemplate__1513854_2351583_&quot;</span> <span class="re0">Height</span>=<span class="st0">&quot;204&quot;</span> <span class="re0">Width</span>=<span class="st0">&quot;371&quot;</span> <span class="re0">FontSize</span>=<span class="st0">&quot;20&quot;</span><span class="re2">&gt;</span></span>
&nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;Window.Resources<span class="re2">&gt;</span></span></span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;SolidColorBrush</span> <span class="re0">x:Key</span>=<span class="st0">&quot;TextBox.Static.Border&quot;</span> <span class="re0">Color</span>=<span class="st0">&quot;#FFABAdB3&quot;</span><span class="re2">/&gt;</span></span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;SolidColorBrush</span> <span class="re0">x:Key</span>=<span class="st0">&quot;TextBox.MouseOver.Border&quot;</span> <span class="re0">Color</span>=<span class="st0">&quot;#FF7EB4EA&quot;</span><span class="re2">/&gt;</span></span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;SolidColorBrush</span> <span class="re0">x:Key</span>=<span class="st0">&quot;TextBox.Focus.Border&quot;</span> <span class="re0">Color</span>=<span class="st0">&quot;#FF569DE5&quot;</span><span class="re2">/&gt;</span></span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;Style</span> <span class="re0">TargetType</span>=<span class="st0">&quot;{x:Type TextBox}&quot;</span><span class="re2">&gt;</span></span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;Setter</span> <span class="re0">Property</span>=<span class="st0">&quot;Background&quot;</span> <span class="re0">Value</span>=<span class="st0">&quot;{DynamicResource {x:Static SystemColors.WindowBrushKey}}&quot;</span><span class="re2">/&gt;</span></span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;Setter</span> <span class="re0">Property</span>=<span class="st0">&quot;BorderBrush&quot;</span> <span class="re0">Value</span>=<span class="st0">&quot;{StaticResource TextBox.Static.Border}&quot;</span><span class="re2">/&gt;</span></span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;Setter</span> <span class="re0">Property</span>=<span class="st0">&quot;Foreground&quot;</span> <span class="re0">Value</span>=<span class="st0">&quot;{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}&quot;</span><span class="re2">/&gt;</span></span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;Setter</span> <span class="re0">Property</span>=<span class="st0">&quot;BorderThickness&quot;</span> <span class="re0">Value</span>=<span class="st0">&quot;1&quot;</span><span class="re2">/&gt;</span></span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;Setter</span> <span class="re0">Property</span>=<span class="st0">&quot;KeyboardNavigation.TabNavigation&quot;</span> <span class="re0">Value</span>=<span class="st0">&quot;None&quot;</span><span class="re2">/&gt;</span></span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;Setter</span> <span class="re0">Property</span>=<span class="st0">&quot;HorizontalContentAlignment&quot;</span> <span class="re0">Value</span>=<span class="st0">&quot;Left&quot;</span><span class="re2">/&gt;</span></span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;Setter</span> <span class="re0">Property</span>=<span class="st0">&quot;FocusVisualStyle&quot;</span> <span class="re0">Value</span>=<span class="st0">&quot;{x:Null}&quot;</span><span class="re2">/&gt;</span></span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;Setter</span> <span class="re0">Property</span>=<span class="st0">&quot;AllowDrop&quot;</span> <span class="re0">Value</span>=<span class="st0">&quot;true&quot;</span><span class="re2">/&gt;</span></span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;Setter</span> <span class="re0">Property</span>=<span class="st0">&quot;ScrollViewer.PanningMode&quot;</span> <span class="re0">Value</span>=<span class="st0">&quot;VerticalFirst&quot;</span><span class="re2">/&gt;</span></span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;Setter</span> <span class="re0">Property</span>=<span class="st0">&quot;Stylus.IsFlicksEnabled&quot;</span> <span class="re0">Value</span>=<span class="st0">&quot;False&quot;</span><span class="re2">/&gt;</span></span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;Setter</span> <span class="re0">Property</span>=<span class="st0">&quot;Template&quot;</span><span class="re2">&gt;</span></span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;Setter.Value<span class="re2">&gt;</span></span></span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;ControlTemplate</span> <span class="re0">TargetType</span>=<span class="st0">&quot;{x:Type TextBox}&quot;</span><span class="re2">&gt;</span></span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;Border</span> <span class="re0">x:Name</span>=<span class="st0">&quot;border&quot;</span> <span class="re0">BorderBrush</span>=<span class="st0">&quot;{TemplateBinding BorderBrush}&quot;</span> <span class="re0">BorderThickness</span>=<span class="st0">&quot;{TemplateBinding BorderThickness}&quot;</span> <span class="re0">Background</span>=<span class="st0">&quot;{TemplateBinding Background}&quot;</span> <span class="re0">SnapsToDevicePixels</span>=<span class="st0">&quot;True&quot;</span><span class="re2">&gt;</span></span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;ScrollViewer</span> <span class="re0">x:Name</span>=<span class="st0">&quot;PART_ContentHost&quot;</span> <span class="re0">Focusable</span>=<span class="st0">&quot;false&quot;</span> <span class="re0">HorizontalScrollBarVisibility</span>=<span class="st0">&quot;Hidden&quot;</span> <span class="re0">VerticalScrollBarVisibility</span>=<span class="st0">&quot;Hidden&quot;</span><span class="re2">/&gt;</span></span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;/Border<span class="re2">&gt;</span></span></span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;ControlTemplate.Triggers<span class="re2">&gt;</span></span></span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;Trigger</span> <span class="re0">Property</span>=<span class="st0">&quot;IsEnabled&quot;</span> <span class="re0">Value</span>=<span class="st0">&quot;false&quot;</span><span class="re2">&gt;</span></span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;Setter</span> <span class="re0">Property</span>=<span class="st0">&quot;Opacity&quot;</span> <span class="re0">TargetName</span>=<span class="st0">&quot;border&quot;</span> <span class="re0">Value</span>=<span class="st0">&quot;0.56&quot;</span><span class="re2">/&gt;</span></span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;/Trigger<span class="re2">&gt;</span></span></span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;Trigger</span> <span class="re0">Property</span>=<span class="st0">&quot;IsMouseOver&quot;</span> <span class="re0">Value</span>=<span class="st0">&quot;true&quot;</span><span class="re2">&gt;</span></span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;Setter</span> <span class="re0">Property</span>=<span class="st0">&quot;BorderBrush&quot;</span> <span class="re0">TargetName</span>=<span class="st0">&quot;border&quot;</span> <span class="re0">Value</span>=<span class="st0">&quot;{DynamicResource TextBox.MouseOver.Border}&quot;</span><span class="re2">/&gt;</span></span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;/Trigger<span class="re2">&gt;</span></span></span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;Trigger</span> <span class="re0">Property</span>=<span class="st0">&quot;IsKeyboardFocused&quot;</span> <span class="re0">Value</span>=<span class="st0">&quot;true&quot;</span><span class="re2">&gt;</span></span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;Setter</span> <span class="re0">Property</span>=<span class="st0">&quot;BorderBrush&quot;</span> <span class="re0">TargetName</span>=<span class="st0">&quot;border&quot;</span> <span class="re0">Value</span>=<span class="st0">&quot;{DynamicResource TextBox.Focus.Border}&quot;</span><span class="re2">/&gt;</span></span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;/Trigger<span class="re2">&gt;</span></span></span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;/ControlTemplate.Triggers<span class="re2">&gt;</span></span></span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;/ControlTemplate<span class="re2">&gt;</span></span></span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;/Setter.Value<span class="re2">&gt;</span></span></span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;/Setter<span class="re2">&gt;</span></span></span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;Style.Triggers<span class="re2">&gt;</span></span></span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;MultiTrigger<span class="re2">&gt;</span></span></span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;MultiTrigger.Conditions<span class="re2">&gt;</span></span></span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;Condition</span> <span class="re0">Property</span>=<span class="st0">&quot;IsInactiveSelectionHighlightEnabled&quot;</span> <span class="re0">Value</span>=<span class="st0">&quot;true&quot;</span><span class="re2">/&gt;</span></span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;Condition</span> <span class="re0">Property</span>=<span class="st0">&quot;IsSelectionActive&quot;</span> <span class="re0">Value</span>=<span class="st0">&quot;false&quot;</span><span class="re2">/&gt;</span></span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;/MultiTrigger.Conditions<span class="re2">&gt;</span></span></span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;Setter</span> <span class="re0">Property</span>=<span class="st0">&quot;SelectionBrush&quot;</span> <span class="re0">Value</span>=<span class="st0">&quot;{DynamicResource {x:Static SystemColors.InactiveSelectionHighlightBrushKey}}&quot;</span><span class="re2">/&gt;</span></span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;/MultiTrigger<span class="re2">&gt;</span></span></span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;/Style.Triggers<span class="re2">&gt;</span></span></span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;/Style<span class="re2">&gt;</span></span></span>
&nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;/Window.Resources<span class="re2">&gt;</span></span></span>
&nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;Grid<span class="re2">&gt;</span></span></span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;TextBox</span> <span class="re0">VerticalAlignment</span>=<span class="st0">&quot;Top&quot;</span> <span class="re0">HorizontalAlignment</span>=<span class="st0">&quot;Center&quot;</span> <span class="re0">BorderBrush</span>=<span class="st0">&quot;Green&quot;</span> <span class="re0">Text</span>=<span class="st0">&quot;Пример текста&quot;</span><span class="re2">&gt;</span></span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;TextBox.Resources<span class="re2">&gt;</span></span></span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;SolidColorBrush</span> <span class="re0">x:Key</span>=<span class="st0">&quot;TextBox.MouseOver.Border&quot;</span> <span class="re0">Color</span>=<span class="st0">&quot;Red&quot;</span><span class="re2">/&gt;</span></span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;SolidColorBrush</span> <span class="re0">x:Key</span>=<span class="st0">&quot;TextBox.Focus.Border&quot;</span> <span class="re0">Color</span>=<span class="st0">&quot;Yellow&quot;</span><span class="re2">/&gt;</span></span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;/TextBox.Resources<span class="re2">&gt;</span></span></span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;/TextBox<span class="re2">&gt;</span></span></span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;TextBox</span> <span class="re0">VerticalAlignment</span>=<span class="st0">&quot;Center&quot;</span> <span class="re0">HorizontalAlignment</span>=<span class="st0">&quot;Center&quot;</span> <span class="re0">BorderBrush</span>=<span class="st0">&quot;Transparent&quot;</span> <span class="re0">Text</span>=<span class="st0">&quot;Пример текста&quot;</span><span class="re2">&gt;</span></span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;TextBox.Resources<span class="re2">&gt;</span></span></span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;SolidColorBrush</span> <span class="re0">x:Key</span>=<span class="st0">&quot;TextBox.MouseOver.Border&quot;</span> <span class="re0">Color</span>=<span class="st0">&quot;Transparent&quot;</span><span class="re2">/&gt;</span></span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;SolidColorBrush</span> <span class="re0">x:Key</span>=<span class="st0">&quot;TextBox.Focus.Border&quot;</span> <span class="re0">Color</span>=<span class="st0">&quot;Transparent&quot;</span><span class="re2">/&gt;</span></span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;/TextBox.Resources<span class="re2">&gt;</span></span></span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;/TextBox<span class="re2">&gt;</span></span></span>
&nbsp; &nbsp; &nbsp; &nbsp;<span class="sc3"><span class="re1">&lt;Button</span> <span class="re0">VerticalAlignment</span>=<span class="st0">&quot;Bottom&quot;</span> <span class="re0">HorizontalAlignment</span>=<span class="st0">&quot;Center&quot;</span><span class="re2">&gt;</span></span>Кнопка<span class="sc3"><span class="re1">&lt;/Button<span class="re2">&gt;</span></span></span>
&nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;/Grid<span class="re2">&gt;</span></span></span>
<span class="sc3"><span class="re1">&lt;/Window<span class="re2">&gt;</span></span></span></pre></td></tr></table></div></td></tr></tbody></table></div></div>

]]></content:encoded>
			<dc:creator>Элд Хасп</dc:creator>
			<guid isPermaLink="true">https://www.cyberforum.ru/blogs/1297115/5553.html</guid>
		</item>
	</channel>
</rss>
