Внедрив программный код, вы создали дополнительный NameScope. Вы можете удалить этот дополнительный NameScope во время выполнения, очистив NameScope после вызова InitializeComponent():
public ElementBorder()
{
InitializeComponent();
NameScope.SetNameScope(this, null);
...
}
Хотя это сработает, это не лучшее решение. Вам лучше создать стиль, который UserControl.
Есть два способа сделать это: С подклассом и без.
С подклассом
Создайте свой подкласс ElementBorder и переопределите стиль по умолчанию. Не вызывайте InitializeComponent():
public class ElementBorder
{
static ElementBorder
{
DefaultStyleKeyProperty.OverrideMetadata(typeof(ElementBorder), new FrameworkPropertyMetadata(typeof(ElementBorer)));
}
// any additional implementation
}
В вашем файле xaml вместо включения тега создайте ResourceDictionary, содержащий стиль с нужными настройками:
<ResourceDictionary xmlns=... >
<Style TargeType="{x:Type my:ElementBorder}">
<Setter Property="BorderThickness" Value="4" />
...
Объедините этот ResourceDictionary со словарем, определенным в app.xaml или themes/Generic.xaml, используя тег ‹MergeDictionary>.
Обратите внимание, что вы можете просто поместить стиль в ResourceDictionary в своем app.xaml вместо создания отдельного файла.
Использование этого идентично использованию исходного ElementBorder:
<my:ElementBorder>
<StackPanel ...
Без подкласса
Это требует меньше кода. Просто поместите стиль в ResourceDictionary, как и раньше, за исключением того, что дайте ему x:Key и используйте Border в качестве целевого типа:
<ResourceDictionary>
<Style x:Key="ElementBorderStyle" TargeType="{x:Type Border}">
<Setter Property="BorderThickness" Value="4" />
...
Это можно использовать следующим образом:
<Border Style="{StaticResource ElementBorderStyle}">
<StackPanel ...
Если вы хотите, чтобы все ваши границы имели новый стиль, это еще проще. Просто опустите x:Key и используйте Border в качестве TargetType:
<ResourceDictionary>
<Style TargeType="{x:Type Border}">
<Setter Property="BorderThickness" Value="4" />
...
Это приведет к тому, что все границы получат стиль, поэтому вы можете просто написать:
<Border>
<StackPanel ...
Ответ на дополнительный вопрос в комментарии ниже
Чтобы установить BorderBrush так же, как фон:
<Style TargeType="{x:Type Border}">
<Setter Property="BorderBrush" Value="{Binding Background, RelativeSource={RelativeSource Self}}" />
...
Чтобы установить фон дочернего элемента на фон границы: обычно это не требуется, поскольку, пока цвет фона дочернего элемента не установлен, цвет фона границы будет просвечиваться. Единственным исключением являются ситуации с отрицательным полем или RenderTransform, когда дочерний элемент не отображается полностью внутри содержащей границы. В этом случае вам нужно будет привязать фон ребенка к фону границы. Это невозможно сделать в стиле, примененном к BorderBrush, без использования прикрепленного свойства. Но если вы можете делать это без стиля:
<Border x:Name="myBorder"> <!-- Style applied here -->
<StackPanel Background="{Binding Background, ElementName=myBorder}" ...
это также можно сделать с безымянной границей с {Binding Background, RelativeSource={RelativeSource FindAncestor,Border,1}.
Если вы хотите сделать это полностью в стиле, вам придется добавить немного кода. По сути, создайте класс с прикрепленным свойством с именем вроде «MyBindingTools.BindChildBackgroundToMyBackground». Добавьте PropertyChangedCallback, чтобы, когда для этого свойства установлено значение «true», на дочернем элементе создавалась привязка, в основном:
BindingOperations.SetBinding(border, BackgroundProperty, new Binding("Background") { Source = this });
Кроме того, вам нужно будет следить за свойством Border's Child, чтобы при его изменении привязка могла быть добавлена к новому дочернему элементу и удалена из старого дочернего элемента (если есть).
Я бы не рекомендовал вам делать что-либо из этого, если вам это действительно не нужно. В вашей конкретной ситуации вы, вероятно, можете либо привязать дочерний элемент вручную, либо создать шаблон, содержащий как границу, так и дочерний элемент управления. Любой из них будет лучшим решением, чем создание присоединенного свойства, как я описал.
person
Ray Burns
schedule
08.11.2009