При выполнении в лабораторной работе упражнения №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 к реляционным данным
Вкладка Page5. Привязка интерфейса WPF к XML-данным с помощью класса XmlDataProvider
Класс XmlDataProvider позволяет создать логический ресурс из данных XML -формата и уже к нему привязывать интерфейс WPF. Рассмотрим это на простом примере.
- В контейнер TabControl файла Window1.xaml добавьте вкладку Page5
<!-- Привязка к объекту с помощью класса XmlDataProvider --> <TabItem Header="Page5" Selector.IsSelected="True"> <TabItem.Resources> <XmlDataProvider x:Key="myDocument" Source="Data/XmlDocument.xml" /> </TabItem.Resources> <Grid DataContext="{Binding ElementName=listCustomers5, Path=SelectedItem}"> <Grid.RowDefinitions> <RowDefinition /> <RowDefinition Height="Auto" /> </Grid.RowDefinitions> <Grid> <Grid.RowDefinitions> <RowDefinition Height="Auto" /> <RowDefinition /> </Grid.RowDefinitions> <Grid.ColumnDefinitions> <ColumnDefinition Width="2*" /> <ColumnDefinition Width="1.5*" /> <ColumnDefinition Width="2*" /> </Grid.ColumnDefinitions> <TextBlock Grid.Column="0" HorizontalAlignment="Center">ContactName</TextBlock> <ListBox Grid.Row="1" Grid.Column="0" Name="listCustomers5" Margin="0,0,0,3" ScrollViewer.VerticalScrollBarVisibility="Auto" ItemsSource="{Binding Source={StaticResource myDocument}, XPath=NewDataSet/Customers}" DisplayMemberPath="ContactName" IsSynchronizedWithCurrentItem="True" /> <TextBlock Grid.Column="1" HorizontalAlignment="Center">CustomerID</TextBlock> <ListBox Grid.Row="1" Grid.Column="1" Margin="0,0,0,3" ScrollViewer.VerticalScrollBarVisibility="Auto" ItemsSource="{Binding Source={StaticResource myDocument}, XPath=NewDataSet/Orders}" DisplayMemberPath="CustomerID" /> <TextBlock Grid.Column="2" HorizontalAlignment="Center">ProductName</TextBlock> <ListBox Grid.Row="1" Grid.Column="2" Margin="0,0,0,3" ScrollViewer.VerticalScrollBarVisibility="Auto" ItemsSource="{Binding Source={StaticResource myDocument}, XPath=NewDataSet/Order_Details_Extended}" DisplayMemberPath="ProductName" /> </Grid> <Grid Grid.Row="1"> <Grid.ColumnDefinitions> <ColumnDefinition Width="Auto" /> <ColumnDefinition /> </Grid.ColumnDefinitions> <Grid.RowDefinitions> <RowDefinition Height="Auto" /> <RowDefinition Height="Auto" /> <RowDefinition Height="Auto" /> <RowDefinition Height="Auto" /> </Grid.RowDefinitions> <TextBlock Grid.Row="0" Margin="0,0,5,0">CompanyName:</TextBlock> <TextBox Grid.Row="0" Grid.Column="1" Text="{Binding XPath=CompanyName, Mode=OneWay}" Focusable="False" Margin="5,0,0,0" /> <TextBlock Grid.Row="1">Address:</TextBlock> <TextBox Grid.Row="1" Grid.Column="1" Text="{Binding XPath=Address, Mode=OneWay}" Focusable="False" Margin="5,0,0,0" /> <TextBlock Grid.Row="2">City:</TextBlock> <TextBox Grid.Row="2" Grid.Column="1" Text="{Binding XPath=City, Mode=OneWay}" Focusable="False" Margin="5,0,0,0" /> <TextBlock Grid.Row="3">Country:</TextBlock> <TextBox Grid.Row="3" Grid.Column="1" Text="{Binding XPath=Country, Mode=OneWay}" Focusable="False" Margin="5,0,0,0" /> </Grid> </Grid> </TabItem>
- В файл Window1.xaml.cs добавьте код создания XML -документа
public partial class Window1 : Window { public Window1() { InitializeComponent(); Page1(); Page2(); Page3(); Page5(); } ............................................................ #region Вкладка Page5 void Page5() { // Готовим путь к сохранению XML-документа String path; //path = System.Environment.CurrentDirectory + "\\Data";//Вариант 1 path = AppDomain.CurrentDomain.BaseDirectory + "Data"; //Вариант 2 string fileName = System.IO.Path.Combine(path, "XmlDocument.xml"); // Создаем только раз if (System.IO.File.Exists(fileName)) return; // Создаем заполненный реляционный набор данных MyObject myObject = new MyObject(); DataSet dataSet = myObject.GetCollection(); // Создаем XML-документ и загружаем его данными набора System.Xml.XmlDataDocument document = new System.Xml.XmlDataDocument(dataSet); // Сохраняем документ в файле document.Save(fileName); // Бросаем набор и документ (для очевидности!) dataSet.Dispose(); document = null; // Вызываем сборщик мусора (для разнообразия!) GC.WaitForFullGCComplete(); // Ждать завершения сборки мусора GC.Collect(); // Начать сборку мусора } #endregion }
- Запустите приложение, чтобы создать XML -документ
- В панели Solution Explorer для узла Data выполните команду Add/Existing Item и присоедините к проекту файл XmlDocument.xml из папки Data, дочерней к каталогу нахождения исполнимой сборки приложения ( bin\Debug\Data или bin\Release\Data ). Без последнего действия при запуске через оболочку вкладка Page5 работать не будет, а при запуске напрямую через исполнимую сборку - будет
-
Проследите, чтобы свойства присоединенного файла XmlDocument.xml в панели Properties были
- Build Action=Content
- Copy to Output Directory=Copy if newer
- Запустите приложение - вкладка Page5 работает частично!!!
Атрибут IsSynchronizedWithCurrentItem="True" из именованного списка listCustomers5 можно удалить, но тогда текстовые поля получат первое значение только при выделении элемента списка.
- Найдите в подкаталоге Data папки размещения исполнимой сборки файл XmlDocument.xml и откройте его
Мы видим, что все реляционные зависимости между таблицами при преобразовании из набора DataSet в XML -формат были утрачены, поэтому нам не удалось построить такую же функциональность, как в предыдущих примерах. Но пример применения класса XmlDataProvider в качестве источника данных для привязываемых элементов интерфейса WPF мы все-таки рассмотрели и отправную точку для более глубокого изучения обозначили.
Дальше сами: автобусом до сходней, а там по шпалам, опять по шпалам...!