Начните с создания нового проекта приложения WPF по имени CustomDependencyProperty. Выберите в меню Project (Проект) пункт Add User Control (WPF) (Добавить пользовательский элемент управления (WPF)) и создайте элемент управления с именем ShowNumberControl.xaml.

На заметку! Более подробные сведения о классе UserControl в WPF ищите в главе 27, а пока просто следуйте указаниям по мере проработки примера.

Подобно окну типы UserControl в WPF имеют файл XAML и связанный файл кода. Модифицируйте разметку XAML пользовательского элемента управления, чтобы определить простой элемент Label внутри Grid:

  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:local="clr-namespace: CustomDependencyProperty"

  mc:Ignorable="d"

  d:DesignHeight="300" d:DesignWidth="300">

 

   

      Background="LightBlue"/>

 

В файле кода для данного элемента создайте обычное свойство .NET Core, которое упаковывает поле типа int и устанавливает новое значение для свойства Content элемента Label:

public partial class ShowNumberControl : UserControl

{

  public ShowNumberControl()

  {

    InitializeComponent();

  }

  // Обычное свойство .NET Core.

  private int _currNumber = 0;

  public int CurrentNumber

  {

    get => _currNumber;

    set

    {

      _currNumber = value;

      numberDisplay.Content = CurrentNumber.ToString();

    }

  }

}

Обновите определение XAML в MainWindow.xml, объявив экземпляр специального элемента управления внутри диспетчера компоновки StackPanel. Поскольку специальный элемент управления не входит в состав основных сборок WPF, понадобится определить специальное пространство имен XML, которое отображается на него. Вот требуемая разметка:

  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:myCtrls="clr-namespace: CustomDependencyProperty"

  xmlns:local="clr-namespace: CustomDependencyProperty"

  mc:Ignorable="d"

  Title="Simple Dependency Property App" Height="450" Width="450"

  WindowStartupLocation="CenterScreen">

 

    

       HorizontalAlignment="Left" x:Name="myShowNumberCtrl"

       CurrentNumber="100"/>

 

Похоже, что визуальный конструктор Visual Studio корректно отображает значение, установленное в свойстве CurrentNumber (рис. 25.23).

Однако что, если к свойству CurrentNumber необходимо применить объект анимации, который обеспечит изменение значения свойства от 100 до 200 в течение 10 секунд? Если это желательно сделать в разметке, тогда область myCtrls:ShowNumberControl можно изменить следующим образом:

 

   

     

       

         

           

         

       

     

   

 

После запуска приложения объект анимации не сможет найти подходящую цель и сгенерируется исключение. Причина в том, что свойство CurrentNumber не было зарегистрировано как свойство зависимости! Чтобы устранить проблему, возвратитесь в файл кода для специального элемента управления и полностью закомментируйте текущую логику свойства (включая закрытое поддерживающее поле).

Теперь добавьте показанный ниже код, чтобы свойство CurrentNumber создавалось как свойство зависимости:

public int CurrentNumber

{

  get => (int)GetValue(CurrentNumberProperty);

  set => SetValue(CurrentNumberProperty, value);

}

public static readonly DependencyProperty CurrentNumberProperty =

  DependencyProperty.Register("CurrentNumber",

  typeof(int),

  typeof(ShowNumberControl),

  new UIPropertyMetadata(0));

Перейти на страницу:

Похожие книги