Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Wpf-АК11.doc
Скачиваний:
3
Добавлен:
01.03.2025
Размер:
3.47 Mб
Скачать

3. Присоединенные свойства

Присоединенные свойства — это просто еще один вид свойств зависимости. С помощью присоединенных свойств можно использовать свойства зависимости из классов, которые находятся вне текущего класса. Вспомните Canvas.Left из первой части — это и есть присоединенное свойство. Такое свойство будет обеспечивать общее место для переноса чего-либо. Например, при использовании свойства Canvas.Left левая граница элемента будет задана в соответствии с указанным значением.

Допустим, мы хотим, чтобы все окна в приложении выглядели одинаково: все были с верхним баннером и областью содержимого. Что-нибудь наподобие частично построенных форм или главных страниц в ASP.NET. Чтобы сделать это, необходимо следующее:

  1. Создать присоединенное свойство зависимости.

  2. Задать его для всех окон, которые должны выглядеть одинаково.

На рисунке 6.8 представлено окно с неактивным присоединенным свойством зависимости (свойству зависимости присвоено значение false).

Рис. 6.8 - Окно с неактивным присоединенным свойством

И с активным присоединенным свойством зависимости (свойству зависимости присвоено значение true) (рис. 6.9).

Рис. 6.9 - Окно с активным присоединенным свойством

Ниже приведена разметка XAML.

   xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

   xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

   xmlns:local="clr-namespace:Attached_Properties_DPs"

   local:AttachedPropertyChildAdder.IsMasterHeaderApplied="true"

   WindowStartupLocation="CenterScreen"

   Title="Attached_Properties_DPs" Height="400" Width="600">

Важнаястрока — local:AttachedPropertyChildAdder.IsMasterHeaderApplied="true". Она определяет, активно ли присоединенное свойство зависимости. И код программной части.

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Windows;

using System.Windows.Controls;

using System.Windows.Shapes;

using System.Windows.Media;

using System.Windows.Media.Imaging;

namespace Attached_Properties_DPs

{

   ///

   /// Простой пример для демонстрации использования присоединенного свойства зависимости.

   /// В этом примере в содержимое окна по умолчанию добавляется заголовок с

   /// новым содержимым. Аналогично использованию главных страниц в ASP.NET

   ///

   public class AttachedPropertyChildAdder

   {

       #region Register IsMasterHeaderApplied DP

       public static readonly DependencyProperty IsMasterHeaderAppliedProperty =

           DependencyProperty.RegisterAttached("IsMasterHeaderApplied",

               typeof(Boolean),

               typeof(AttachedPropertyChildAdder),

               new FrameworkPropertyMetadata(IsMasterHeaderAppliedChanged));

       public static void SetIsMasterHeaderApplied(DependencyObject element, Boolean value)

       {

           element.SetValue(IsMasterHeaderAppliedProperty, value);

       }

       public static Boolean GetIsMasterHeaderApplied(DependencyObject element)

       {

           return (Boolean)element.GetValue(IsMasterHeaderAppliedProperty);

       }

       #endregion

       #region PropertyChanged callback

       ///

       /// Вызывается, когдапользовательприсоединенногосвойствазависимости IsMasterHeaderApplied Attached изменяет

       /// значениесвойствазависимости IsMasterHeaderApplied.

       ///

       ///

       ///

       public static void IsMasterHeaderAppliedChanged(DependencyObject obj, DependencyPropertyChangedEventArgs args)

       {

           if ((bool)args.NewValue)

           {

               if (obj is Window)

               {

                   Window wnd = (Window)obj;

                   wnd.Loaded += new RoutedEventHandler(wnd_Loaded);

               }

           }

       }

       ///

       /// Присоединение к событию загрузки окна для замены содержимого окна

       /// пользовательским содержимым для демонстрации возможностей свойств зависимости.

       ///

       /// В этом примере создается заголовок окна.

       ///

       /// Задание свойства IsMasterHeaderApplied обеспечит

       /// использование заголовка.

       ///

       /// Аналогично главным страницам в ASP.NET

       ///

       public static void wnd_Loaded(object sender, RoutedEventArgs e)

       {

           try

           {

               DockPanel dp = new DockPanel();

               dp.LastChildFill = true;

               StackPanel sp = new StackPanel();

               dp.Children.Add(sp);

               sp.Background = new SolidColorBrush(Colors.CornflowerBlue);

               sp.Orientation = Orientation.Vertical;

               sp.SetValue(DockPanel.DockProperty, Dock.Top);

               BitmapImage bitmap = new BitmapImage(new Uri("Images/Header.png", UriKind.Relative));

               Image image = new Image();

               image.Source = bitmap;

               sp.Children.Add(image);

               UIElement el = ((DependencyObject)sender as Window).Content as UIElement;

               el.SetValue(DockPanel.DockProperty, Dock.Bottom);

               ((DependencyObject)sender as Window).Content = null;

               dp.Children.Add(el);

              ((DependencyObject)sender as Window).Content = dp;

           }

           catch (Exception ex)

           {

               System.Diagnostics.Debug.WriteLine(string.Format("Exception : {}",ex.Message));

           }

       }

       #endregion

   }

}

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]