|
При выполнении в лабораторной работе упражнения №1 , а именно при выполнении нижеследующего кода: using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using Microsoft.Xna.Framework.Graphics;
namespace Application1 { public partial class MainForm : Form { // Объявим поле графического устройства для видимости в методах GraphicsDevice device;
public MainForm() { InitializeComponent();
// Подпишемся на событие Load формы this.Load += new EventHandler(MainForm_Load);
// Попишемся на событие FormClosed формы this.FormClosed += new FormClosedEventHandler(MainForm_FormClosed); }
void MainForm_FormClosed(object sender, FormClosedEventArgs e) { // Удаляем (освобождаем) устройство device.Dispose(); // На всякий случай присваиваем ссылке на устройство значение null device = null; }
void MainForm_Load(object sender, EventArgs e) { // Создаем объект представления для настройки графического устройства PresentationParameters presentParams = new PresentationParameters(); // Настраиваем объект представления через его свойства presentParams.IsFullScreen = false; // Включаем оконный режим presentParams.BackBufferCount = 1; // Включаем задний буфер // для двойной буферизации // Переключение переднего и заднего буферов // должно осуществляться с максимальной эффективностью presentParams.SwapEffect = SwapEffect.Discard; // Устанавливаем размеры заднего буфера по клиентской области окна формы presentParams.BackBufferWidth = this.ClientSize.Width; presentParams.BackBufferHeight = this.ClientSize.Height;
// Создадим графическое устройство с заданными настройками device = new GraphicsDevice(GraphicsAdapter.DefaultAdapter, DeviceType.Hardware, this.Handle, presentParams); }
protected override void OnPaint(PaintEventArgs e) { device.Clear(Microsoft.Xna.Framework.Graphics.Color.CornflowerBlue);
base.OnPaint(e); } } } Выбрасывается исключение: Невозможно загрузить файл или сборку "Microsoft.Xna.Framework, Version=3.0.0.0, Culture=neutral, PublicKeyToken=6d5c3888ef60e27d" или один из зависимых от них компонентов. Не удается найти указанный файл. Делаю все пунктуально. В чем может быть проблема? |
Основы привязки данных в WPF
Часть II
Упражнение 2. Привязка интерфейсных элементов к невизуальным объектам
В предыдущем упражнении мы рассматривали привязку элементов, являющихся визуальными элементами WPF. Но такая задача, на самом деле, возникает редко. В реальных приложениях, предназначенных для управления данными и управляемых данными, чаще используются привязки, предназначенные для извлечения информации визуальными элементами из невизуальных объектов - хранителей и источников данных.
Прежде, чем начать рассмотрение таких привязок, стоит вернуться к классу Binding и познакомиться с ним более подробно. Этот класс обеспечивает возможность связывания данных, устанавливая связь конечного свойства: с исходным свойством элемента, с другим объектом или списком объектов-источников. Основные свойства класса Binding приведены в таблице, а терминология используется с учетом размещения выражения привязки на приемнике информации.
| Свойство | Тип | Описание |
|---|---|---|
| ElementName | String -класс | Задает или извлекает имя элемента, который будет использоваться как источник информации. При связывании с элементом WPF применяется вместо свойства Source |
| FallbackValue | Object -класс | Задает или извлекает значение для использования, если привязка не может вернуть значение. Значение по умолчанию UnsetValue |
| Mode | BindingMode -перечисление | Получает или устанавливает значение, которое указывает направление потока данных в привязке |
| NotifyOnSourceUpdated | Boolean -структура | Получает или устанавливает флаг, который указывает, возбуждается ли событие SourceUpdated при передаче данных от целевого элемента к источнику |
| Path | PropertyPath -класс | Задает или извлекает путь к свойству источника |
| RelativeSource | RelativeSource -класс | Задает или извлекает источник путем указания его местоположения относительно целевого элемента в визуальном дереве |
| Source | Оbject -класс | Используется для указания на объект-источник, если он не является элементом WPF и поэтому нельзя применить ElementName |
Способы привязки рассмотрим на примерах.
-
Добавьте к решению DataBinding командой File/Add/New Project новый проект WPF Application с именем ElementWithObject и назначьте его стартовым
-
Настройте открывающий дескриптор окна Window1 нового проекта так
<Window x:Class="ElementWithObject.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Height="300"
Width="300"
Title="Привязка элемента к объекту"
MinHeight="300"
MinWidth="300"
WindowStartupLocation="CenterScreen"
>
<Grid>
</Grid>
</Window>-
Добавьте к разметке файла Window1.xaml логический ресурс для обеспечения классического цвета фона окна и присоедините его к свойству Background сетки Grid
<Window x:Class="ElementWithObject.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Height="300"
Width="300"
Title="Привязка элемента к объекту"
MinHeight="300"
MinWidth="300"
WindowStartupLocation="CenterScreen"
>
<Window.Resources>
<SolidColorBrush x:Key="ControlColorBrush"
Color="{x:Static SystemColors.ControlColor}" />
</Window.Resources>
<Grid Background="{StaticResource ResourceKey=ControlColorBrush}">
</Grid>
</Window>Вкладка Page1. Использование логического ресурса без привязки
Вначале создадим вкладку для демонстрации способа подключения статического ресурса без использования привязки.
-
Добавьте в разметку контейнер TabControl с вкладкой Page1 следующего содержания
<Grid Background="{StaticResource ResourceKey=ControlColorBrush}">
<TabControl>
<!-- Page1. Использование логического ресурса без привязки -->
<TabItem Header="Page1">
<TabItem.Resources>
<ImageBrush x:Key="flower1"
ImageSource="Images/flower1.jpg"
Stretch="UniformToFill"
Opacity="1"
/>
</TabItem.Resources>
<Rectangle
Stroke="Red"
StrokeThickness="5.0"
Opacity="1"
Fill="{StaticResource flower1}" />
</TabItem>
</TabControl>
</Grid>-
В панели Solution Explorer добавьте к корню проекта ElementWithObject командой контекстного меню Add/New Folder папку с именем Images
-
В панели Solution Explorer для папки Images вызовите контекстное меню и скопируйте в нее командой Add/Existing Item из прилагаемого каталога Source файл flower1.jpg
-
Выделите файл flower1.jpg и в панели Properties проверьте его настройки в оболочке. Они должны быть такими- Build Action=Resource
- Copy to Output Directory=Do not copy
-
Запустите приложение - представление вкладки будет таким
Здесь мы пока не применяли механизм привязки, но вспомнили использование ресурсов.
Вкладка Page2. Связывание целевого элемента с исходным объектом через логический ресурс
Когда встает вопрос привязки визуального элемента к объекту, в отличии от привязки элемента к элементу, то в выражении привязки для обозначения источника нужно использовать взамен атрибута ElementName другой атрибут - Source (или RelativeSource ). В следующем примере используем в качестве посредника привязки логический ресурс.
-
В панели Solution Explorer для папки Images вызовите контекстное меню и скопируйте в нее командой Add/Existing Item из прилагаемого каталога Source файл flower2.jpg
-
Выделите файл flower2.jpg и в панели Properties проверьте его настройки в оболочке. Они должны быть такими- Build Action=None
- Copy to Output Directory=Copy if newer
- В пространство имен файла Window1.xaml.cs добавьте новый класс Pictures со следующим процедурным кодом
using System;
using System.Collections.Generic;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
namespace ElementWithObject
{
public partial class Window1 : Window
{
public Window1()
{
InitializeComponent();
}
}
class Pictures
{
// Поле
public static ImageBrush picture = new ImageBrush();
static Pictures()
{
picture.ImageSource = new BitmapImage(
new Uri(@"Images\flower2.jpg", UriKind.Relative));
picture.Stretch = Stretch.UniformToFill;
picture.Opacity = 1.0D;
}
// Свойство
public static ImageBrush Picture { get { return picture; } }
}
}-
Добавьте в заголовок дескриптора Window запись импортирования пространства имен приложения для доступа к свойству класса Pictures из разметки
<Window x:Class="ElementWithObject.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Height="300"
Width="300"
Title="Привязка элемента к объекту"
MinHeight="300"
MinWidth="300"
WindowStartupLocation="CenterScreen"
xmlns:local="clr-namespace:ElementWithObject"
>
..............................................................
</Window>-
Добавьте в контейнер TabControl новую вкладку с именем Page2 с привязкой логического ресурса к фону кнопки
<!-- Page2. Связывание целевого элемента с исходным
объектом через логический ресурс -->
<TabItem Header="Page2">
<TabItem.Resources>
<TextBlock x:Key="title2"
FontSize="16"
TextAlignment="Center"
FontWeight="Bold">
<TextBlock.Foreground>
<SolidColorBrush Color="Yellow" />
</TextBlock.Foreground>
Связывание целевого элемента
<LineBreak />
с исходным объектом
<LineBreak />
через логический ресурс
</TextBlock>
<local:Pictures x:Key="flower2" />
</TabItem.Resources>
<Button
Content="{StaticResource ResourceKey=title2}"
Background="{Binding Source={StaticResource flower2},
Path=Picture, Mode=OneWay}" />
</TabItem>-
Запустите проект с вкладкой Page2 - область вывода будет такой


