Вводя код, за вами создали дополнительный 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" />
...
Merge это ResourceDictionary в одном определенную в app.xaml или themes/Generic.xaml с помощью значка MergeDictionary <
Обратите внимание, что вы можете просто поместить стиль в ResourceDictionary в свой app.xaml вместо создания отдельного файла.
Используя это идентично с помощью оригинального ElementBorder:
<my:ElementBorder>
<StackPanel ...
Без подкласса
Это требует меньше кода. Просто поместите стиль в ResourceDictionary, как и раньше, за исключением дать ему топор: Ключ и использовать границы, как это целевой тип:
<ResourceDictionary>
<Style x:Key="ElementBorderStyle" TargeType="{x:Type Border}">
<Setter Property="BorderThickness" Value="4" />
...
Это может быть использовано следующим образом:
<Border Style="{StaticResource ElementBorderStyle}">
<StackPanel ...
Если вы хотите, чтобы все ваши границы, чтобы иметь новый стиль, это еще проще. Просто опускаем х: Key и использовать границу в качестве 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 так, что, когда это свойство имеет значение «истина», привязка создается на ребенка, в основном:
BindingOperations.SetBinding(border, BackgroundProperty, new Binding("Background") { Source = this });
Кроме того, вы должны будете следить за имуществом ребенка на границе, так что, когда он изменяет связывание могут быть добавлены к новому Ребенку и удалены из старого Ребенка (если есть).
Я бы не рекомендовал вам делать это, если вам действительно не нужно. В вашей конкретной ситуации вы, вероятно, можете либо привязать ребенка вручную, либо создать шаблон, содержащий как пограничный, так и дочерний элемент управления. Любой из них будет лучшим решением, создающим прикрепленное свойство, как я описал.
Подробнее пожалуйста. Вы подклассифицировали Border или катили свой собственный? Является ли ошибка во время компиляции или времени выполнения? Выполняется ли компиляция/запуск, если вы на самом деле не пытаетесь использовать * имя? –