Возможно ли (не) использовать настраиваемый элемент управления WPF так же, как его базовый класс (в данном случае StackPanel) в XAML? - PullRequest
0 голосов
/ 01 мая 2018

Я хотел бы создать пользовательский элемент управления на основе StackPanel, поскольку мне нужно добавить некоторый код в производный класс.

Я создал пользовательский элемент управления в Visual Studio.

Когда я хочу использовать пользовательский элемент управления в XAML, я получаю различные ошибки.

Я новичок в WPF.

Можно ли (не) использовать настраиваемый элемент управления WPF так же, как его базовый класс в XAML (в данном случае StackPanel)?

c # код

namespace MyNameSpace
{
    public class AbstractForm : StackPanel
    {
        static AbstractForm()
        {
            DefaultStyleKeyProperty.OverrideMetadata(typeof(AbstractForm), new FrameworkPropertyMetadata(typeof(AbstractForm)));
        }
        protected override Size MeasureOverride(Size constraint)
        {
            return base.MeasureOverride(constraint);
        }
        protected override Size ArrangeOverride(Size arrangeBounds)
        {
            return base.ArrangeOverride(arrangeBounds);
        }
        // more code
    }
}

Содержимое Generic.xaml (большинство частей создается при создании пользовательского элемента управления):

<ResourceDictionary
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:MyNameSpace">

    <Style TargetType="{x:Type local:AbstractForm}"
        BasedOn = "{StaticResource {x:Type StackPanel}}">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type local:AbstractForm}">
                    <Border Background="{TemplateBinding Background}"
                            BorderBrush="{TemplateBinding BorderBrush}"
                            BorderThickness="{TemplateBinding BorderThickness}">
                    </Border>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
</ResourceDictionary>

Затем я пытаюсь использовать «AbstractForm» как StackPanel в MainWindow.xaml:

<Window x:Name="MyApp" x:Class="MyNameSpace.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:control="clr-namespace:MyNameSpace"
        mc:Ignorable="d"
        Title="MyApp" BorderBrush="{DynamicResource {x:Static SystemColors.ActiveCaptionTextBrushKey}}">
    <StackPanel x:Name="MyAppUI" Orientation = "vertical" HorizontalAlignment="Left" Margin="0,0,0,0" VerticalAlignment="Top">
        <control:AbstractForm x:Name="HeaderArea" Orientation = "horizontal" HorizontalAlignment="Left" Margin="0,0,0,0" VerticalAlignment="Top">
            <Image x:Name="appImage" HorizontalAlignment="Left" VerticalAlignment="Top" Source = "AppImage.gif"/>
            <StackPanel Orientation = "vertical" HorizontalAlignment="Left" Margin="0,0,0,0" VerticalAlignment="Top">
                <!-- more content -->
            </StackPanel>
        </control:AbstractForm>
        <!-- more content -->
    </StackPanel>
</Window>

При запуске приложения я вижу следующие ошибки (пытается перевести с немецкого):

  • Свойство «Ориентация» не найдено в «AbstractForm»
  • Элемент 'Ориентация' не распознан или недоступен
  • Свойство «Ориентация» не содержится в пространстве имен XML «clr-namespace: MyNameSpace». Строка ... столбец ...
  • Никакой контент не может быть добавлен к объекту типа "AbstractForm" (то есть <Image и другому <StackPanel)

1 Ответ

0 голосов
/ 01 мая 2018

StackPanel не является производным от Control и поэтому не имеет свойства Template. Следовательно, ResourceDictionary не компилируется.

Удалите Setter из стиля по умолчанию, затем перестройте проект.

<ResourceDictionary
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:MyNameSpace">

    <Style TargetType="{x:Type local:AbstractForm}"
           BasedOn="{StaticResource {x:Type StackPanel}}">
    </Style>
</ResourceDictionary>

Также сомнительно, если вам вообще нужен стиль по умолчанию для вашего класса AbstractForm.

Если нет, просто удалите весь файл Generic.xaml и статический конструктор, который переопределяет значение по умолчанию свойства DefaultStyleKey. Другими словами, просто создайте класс, производный от StackPanel.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...