Я наконец разобрался с этим.Чтобы ответить на мой первый вопрос «Почему мы используем Border.BorderBrush в этом коде, если в шаблоне элемента управления не определена граница»:
BorderBrush="{TemplateBinding Border.BorderBrush}"
Граница в Border.BorderBrush существует, поскольку свойство зависимости являетсяопределены в классе границы.Хотя Control имеет свойство зависимости BorderBrush, это свойство фактически определено в Border.то есть, как это определено в Border
BorderBrushProperty = DependencyProperty.Register("BorderBrush", typeof(Brush), typeof(Border), new FrameworkPropertyMetadata(null, FrameworkPropertyMetadataOptions.SubPropertiesDoNotAffectRender | FrameworkPropertyMetadataOptions.AffectsRender, new PropertyChangedCallback(Border.OnClearPenCache)));
, и как это используется в Control
BorderBrushProperty = Border.BorderBrushProperty.AddOwner(typeof(Control), new FrameworkPropertyMetadata(Border.BorderBrushProperty.DefaultMetadata.DefaultValue, FrameworkPropertyMetadataOptions.None));
Ключевым моментом здесь является то, что Control не определяет свою собственную зависимостьсвойство BorderBrush, вместо этого он использует AddOwner, чтобы связать себя с существующим свойством зависимости.Вот почему он определен как Border.BorderBrush в шаблоне элемента управления, даже если текстовое поле не имеет границы в шаблоне элемента управления.
Ответ на мой второй вопрос «где установлено это значение» заключается в том, чтоэто установлено в стиле по умолчанию текстового поля.Я могу взглянуть на стиль по умолчанию для текстового поля, выполнив следующее:
var style = (Style)Application.Current.TryFindResource(typeof(TextBox));
if (style == null) return;
XmlWriterSettings settings = new XmlWriterSettings();
settings.Indent = true;
StringBuilder sb = new StringBuilder();
XmlWriter writer = XmlWriter.Create(sb, settings);
XamlWriter.Save(style, writer);
MessageBox.Show(sb.ToString());
Как только мы запустим этот код, мы увидим, что в стиле оба свойства жестко запрограммированы.Мне это кажется странным, но, очевидно, так оно и было.
<Setter Property="Border.BorderBrush">
<Setter.Value>
<LinearGradientBrush StartPoint="0,0" EndPoint="0,20" MappingMode="Absolute">
<LinearGradientBrush.GradientStops>
<GradientStop Color="#FFABADB3" Offset="0.05" />
<GradientStop Color="#FFE2E3EA" Offset="0.07" />
<GradientStop Color="#FFE3E9EF" Offset="1" />
</LinearGradientBrush.GradientStops>
</LinearGradientBrush>
</Setter.Value>
</Setter>
<Setter Property="Border.BorderThickness">
<Setter.Value>
<Thickness>1,1,1,1</Thickness>
</Setter.Value>
</Setter>
После того, как я скопировал, вставил это в стиль для моего контроля, все заработало, как и ожидалось.
Просто, эй?: -)))