
- •«Комп’ютерні технології та програмування»
- •Оглавление
- •Лабораторная работа 1 Знакомство с wpf
- •Теоретические сведения
- •1. Знакомство с редактором xaml
- •2.Создание приложения wpf
- •3) Создание обработчиков событий
- •Задание к лабораторной работе
- •Варианты индивидуальных заданий
- •Контрольные вопросы
- •Лабораторная работа 2 Подробное введение в разработку приложений wpf
- •Теоретические сведения
- •1. Ознакомление с управлением проектами wpf в msVisualStudio
- •2. Создание тестового приложения wpf
- •Задание к лабораторной работе
- •Варианты индивидуальных заданий
- •Контрольные вопросы
- •Лабораторная работа 3 Макет программы и основные элементы управления
- •Теоретически сведения
- •1. Макет в wpf
- •2. Новые возможности wpf
- •3. Элемент управления Canvas
- •4. Элементуправления StackPanel
- •5. Элементуправления WrapPanel
- •6. Элемент управления DockPanel
- •7. Элемент Grid
- •Задание к лабораторной работе
- •Варианты индивидуальных заданий
- •Контрольные вопросы
- •Лабораторная работа 4
- •Xaml и код, расширения разметки и ресурсы
- •Теоретически сведения
- •2. Ссылки на ресурсы в wpf
- •Задание к лабораторной работе
- •Варианты индивидуальных заданий
- •Контрольные вопросы
- •Лабораторная работа 6 Свойства зависимости
- •Теоретически сведения
- •1. Особенности свойств clr
- •2. Наследование значений свойств зависимости
- •3. Присоединенные свойства
- •4. Метаданныесвойствзависимости
- •5. Проверка допустимости значения
- •Задание к лабораторной работе
- •Варианты индивидуальных заданий
- •Контрольные вопросы
- •Лабораторная работа 7 Привязка данных
- •Теоретически сведения
- •1. Концепция привязки данных
- •2. Свойство DataContext
- •3. Основные понятия привязки данных
- •4. Синтаксис привязки данных
- •5. Привязка к элементам интерфейса пользователя
- •6. Привязка к xml
- •7. Привязка к коллекции
- •8. Преобразователи значений привязки данных
- •9. Проверкапривязкиданных
- •Задание к лабораторной работе
- •Варианты индивидуальных заданий
- •Контрольные вопросы
3. Присоединенные свойства
Присоединенные свойства — это просто еще один вид свойств зависимости. С помощью присоединенных свойств можно использовать свойства зависимости из классов, которые находятся вне текущего класса. Вспомните Canvas.Left из первой части — это и есть присоединенное свойство. Такое свойство будет обеспечивать общее место для переноса чего-либо. Например, при использовании свойства Canvas.Left левая граница элемента будет задана в соответствии с указанным значением.
Допустим, мы хотим, чтобы все окна в приложении выглядели одинаково: все были с верхним баннером и областью содержимого. Что-нибудь наподобие частично построенных форм или главных страниц в ASP.NET. Чтобы сделать это, необходимо следующее:
Создать присоединенное свойство зависимости.
Задать его для всех окон, которые должны выглядеть одинаково.
На рисунке 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
}
}