Содержание блога

воскресенье, 29 августа 2010 г.

Работа с куками (Cookies)

Иногда может потребоваться установить или прочитать Cookies из Silverlight приложения.
Cookies представляют собой строку текста, которая сохраняется на стороне клиента и отправляется на сервер, установивший данную Cookie, при каждом запросе. Их обычно используют для хранения данных о сессии, аутентификации и другой информации, специфичной для конкретного пользователя.
Например, интернет магазин может сохранять в Cookies информацию о выбранных незарегистрированным пользователем товарах. И даже, если такой пользователь закроет окно браузера, он сможет зайти на сайт позже и закончить оформление заказа.
В случае, когда пользователь работает только с Silverlight приложением, лучше использовать изолированное хранилище (IsolatedStorage), оно позволяет хранить любые данные и имеет значительно больший, притом увеличиваемый размер.
Однако бывает, что есть страница, использующая Cookies, и на ней нет Silverlight приложений. При этом прочитать информацию, сохранённую в Cookies надо уже на другой странице из Silverlight приложения.
Как это сделать? Нет ничего проще.
Читать и устанавливать Cookies в Silverlight приложении мы можем, используя объект HtmlPage.Document, определённый в пространстве имён System.Windows.Browser.
Для установки Cookie надо вызвать метод SetProperty() и передать ему строку следующего формата: «Ключ=Значение;expires=Дата_Окончания_Хранения.»
Вот типовой код:
private void SetCookie(string key, string value)
{
  DateTime expireDate =
  DateTime.Now + TimeSpan.FromDays(10);

  string cookie =
  String.Format("{0}={1};expires={2}", key,
  value, expireDate.ToString("R"));
  HtmlPage.Document.SetProperty("cookie", cookie);
}
Прочитать же Cookies можно используя свойство HtmlPage.Document.Cookies.

Также привожу типовой код:
private string GetCookie(string key)
{
  string[] cookies = HtmlPage.Document.Cookies.Split(';');

  foreach (string cookie in cookies)
  {
    string[] keyValue = cookie.Split('=');
    if (keyValue.Length == 2)
    {
      if (keyValue[0].ToString().Trim() == key)
        return keyValue[1];
    }
  }
  return null;
}


ссылка на сайт
(с) Сергей Пугачев

пятница, 27 августа 2010 г.

DataGrid - рецепты по приготовлению

DataGrid очень мощная штука, можно переменную хранящую структурированные данные присвоить значению  dataGridPkt.ItemsSource = PrjProperty.CurrentPiketList;
и таблица уже сама готова... определены поля, заполнены записи...

в принципе уже с этим можно работать... но если нужно приложению придать более дружелюбный вид, то можно внести несколько изменений...

Свой набор полей(Заголовки)
Если при использовании DataGrid, у нас определен класс, которым будет заполняться таблица. можно указать только те поля которые мы будем использовать.
пусть у нас есть класс
PiketList, с полями (ID(int),FROM(string),TO(string),IsPiket(bool),x(double),y(double),z(double) )

Используя механизм Binding можно указать поля которые хотим вывести, для логического типа красивее использовать data:DataGridCheckBoxColumn

<data:DataGrid Grid.Row="1" Name="dataGridPkt" AutoGenerateColumns="False" >
  <data:DataGrid.Columns>

     <data:DataGridTextColumn Binding="{Binding ID}" Header="№"/>
     <data:DataGridTextColumn Binding="{Binding FROM}" Header="От"/>
     <data:DataGridTextColumn Binding="{Binding TO}" Header="До"/>
     <!-- флажок -->
     <data:DataGridCheckBoxColumn Binding="{Binding IsPiket}" Header="Пикет"/>


  </data:DataGrid.Columns>
</data:DataGrid>
теперь при использовании команды
dataGridPkt.ItemsSource = PrjProperty.CurrentPiketList;
будут заполнены указанные поля

Создание кнопки в поле.
для удаления записи можно описать кнопку в поле, и для каждой записи будет своя кнопочка
описание кнопки выглядит так
<data:DataGridTemplateColumn>
      <data:DataGridTemplateColumn.CellTemplate>
             <DataTemplate>
                   <Button x:Name="btnDelete" Content="Удл" Foreground="DarkBlue" Click="btnDelete_Click" >
                           <!-- Всплывающая подсказка -->
                           <ToolTipService.ToolTip>
                                 <ToolTip>
                                       <TextBlock Text="Удалить строчку" />
                                 </ToolTip>
                           </ToolTipService.ToolTip>
                   </Button>
              </DataTemplate>
         </data:DataGridTemplateColumn.CellTemplate>
</data:DataGridTemplateColumn>
для обработки события нажатия на кнопку удаления
создадим окно на подтверждение
для этого добавим новый элемент в наш проект "Дочернее окно Silverligth" - ConfimDeleteRecord
в режиме кода
    public partial class ConfimDeleteRecord : ChildWindow
    {
        int index = 0;
        /// <summary>
        /// Конструктор окна подтверждения
        /// </summary>
        /// <param name="wtlt">Заголовок</param>
        /// <param name="msg">Сообщение</param>
        /// <param name="idx">номер </param>
        public ConfimDeleteRecord(string wtlt, string msg, int idx)
        {
            InitializeComponent();

            index = idx;
            this.Title = wtlt;
            this.Message.Text = msg;
        }

        private void OKButton_Click(object sender, RoutedEventArgs e)
        {
            PrjProperty.CurrentPiketList.RemoveAt(index);
            this.DialogResult = true;
        }

        private void CancelButton_Click(object sender, RoutedEventArgs e)
        {
            this.DialogResult = false;
        }
    }


в нашей странице теперь вызовем окно и создадим обработчик событий

        #region ConfimDeleteRecord_Closed -- Событие закрытия окна Удаления
        private void ConfimDeleteRecord_Closed(object sender, EventArgs e)
        {
            var result = ((ChildWindow)sender).DialogResult;
            if (result.HasValue)
            {
                //результат нажатия кнопки OK/Cancel у нас в result.Value
                if (result.Value == true)
                {
                    textBlockStatus.Text = "Запись удалена";
                    refreshTable();
                }
            }
        }
        #endregion ConfimDeleteRecord_Closed

        #region btnDelete_Click -- Удалить запись
        private void btnDelete_Click(object sender, RoutedEventArgs e)
        {
            int i = dataGridPkt.SelectedIndex;
            ConfimDeleteRecord del = new ConfimDeleteRecord("Удаление записи...", "Вы действительно желаете удалить запись № " + i, i);
            del.Closed += new EventHandler(ConfimDeleteRecord_Closed);
            del.Show();
        }
        #endregion btnDelete_Click

четверг, 19 августа 2010 г.

Использование Grid для создания резиновой страницы

Создание сетки 3х3
        <Grid Name="MainGrid" Margin="0,0,0,0" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" ShowGridLines="False" >
            <Grid.RowDefinitions>
                <RowDefinition  Height="19" />
                <RowDefinition Height="436*" />
                <RowDefinition  Height="25" />
            </Grid.RowDefinitions>
            <Grid.ColumnDefinitions>
                <ColumnDefinition  Width="26" />
                <ColumnDefinition Width="510*" />
                <ColumnDefinition  Width="150" />
            </Grid.ColumnDefinitions>
сами элементы размещение элементов указывается Grid.Row Grid.Column
если необходимо чтобы объект занимал несколько полей то Grid.RowSpan
пример расположения элементов в гриде
<Grid Name="MainGrid" Margin="0,0,0,0" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" ShowGridLines="False" >
 <Grid.RowDefinitions>
     <RowDefinition  Height="19" />
     <RowDefinition Height="436*" />
     <RowDefinition  Height="25" />
  </Grid.RowDefinitions>
  <Grid.ColumnDefinitions>
      <ColumnDefinition  Width="26" />
      <ColumnDefinition Width="510*" />
      <ColumnDefinition  Width="150" />
  </Grid.ColumnDefinitions>
  <Grid Grid.Row="1" Grid.RowSpan="2" Name="gridToolPanel" VerticalAlignment="Stretch" Background="#FF9CAAC1" />
  <Grid Grid.Column="1" Grid.Row="2"  Name="gridBottomPanel" VerticalAlignment="Stretch" Background="#FF9CAAC1" />
  <Grid Grid.Column="2" Grid.Row="1"  Grid.RowSpan="2" Name="gridPropertyPanel" Background="#FFCED4DD" />
</Grid>

вторник, 17 августа 2010 г.

Сохранить файл из приложения на silverligth

Обрабатываем кнопку
private void buttonSaveXML_Click(object sender, RoutedEventArgs e)
        {
            SaveFileDialog saveFileDlg1 = new SaveFileDialog();
            saveFileDlg1.Filter = "Cave|*.cave|all|*.*";
            
            saveFileDlg1.ShowDialog();
            if (saveFileDlg1.SafeFileName != "")
            {
                System.IO.Stream stream = saveFileDlg1.OpenFile();

                GenGFXtoXML(stream);

                stream.Flush();
                stream.Close();
            }
        }

функция GenGFXtoXML - генерирует XML файл и сохраняет его в поток stream

public void GenGFXtoXML(System.IO.Stream stream)
        {
            StringWriter sw = new StringWriter();
            XmlWriterSettings settings = new XmlWriterSettings();
            settings.Indent = true;
            //settings.NewLineOnAttributes = true;
            settings.ConformanceLevel = ConformanceLevel.Document;
            settings.OmitXmlDeclaration = true;

            using (XmlWriter xml = XmlWriter.Create(sw, settings))
            {
                xml.WriteStartDocument();
                xml.WriteComment("Создано WebPiket ver " + version);
                xml.WriteStartElement("gfx");
                #region Линия масштаба line_scale

                Line lnscale = (Line)cnvDrawPoly.Children[3];// линия масштаба
                xml.WriteStartElement("lnscale");

                xml.WriteStartAttribute("Name");
                xml.WriteString(lnscale.Name);
                xml.WriteEndAttribute();

                xml.WriteStartAttribute("X1");
                xml.WriteString(lnscale.X1.ToString());
                xml.WriteEndAttribute();

                xml.WriteStartAttribute("Y1");
                xml.WriteString(lnscale.Y1.ToString());
                xml.WriteEndAttribute();

                xml.WriteStartAttribute("X2");
                xml.WriteString(lnscale.X2.ToString());
                xml.WriteEndAttribute();

                xml.WriteStartAttribute("Y2");
                xml.WriteString(lnscale.Y2.ToString());
                xml.WriteEndAttribute();

                xml.WriteEndElement();//lnscale
                #endregion Линия масштаба line_scale 
                
                #region Генератор  XML
                 //    .....................
                #endregion Генератор  XML
            
                xml.WriteEndElement();//gfx 
                xml.WriteEndDocument();
                xml.Close();
            }
            //Сохранение в файл
            using (StreamWriter writer = new StreamWriter(stream))
            {
                writer.Write(sw);
                writer.Flush();
                writer.Close();

            }
        }
<!--Создано WebPiket ver 1.20100817.1811-->
<gfx>
  <lnscale Name="line_Scale" X1="978" Y1="813" X2="982" Y2="817" />
  <surve Name="surve_top_1">
    <GeometryGroup>
       <LineGeometry X1="486,149658203125" Y1="412,589233398438" X2="495,5" Y2="409" />
      <LineGeometry X1="491,280883789063" Y1="412,0654296875" X2="495,5" Y2="409" />
    </GeometryGroup>
  </surve>
  <surve Name="surve_top_wall2">
    <GeometryGroup>
       <LineGeometry X1="486,149658203125" Y1="412,589233398438" X2="495,5" Y2="409" />
      <LineGeometry X1="491,280883789063" Y1="412,0654296875" X2="495,5" Y2="409" />
      <LineGeometry X1="483,647216796875" Y1="418,938720703125" X2="491,280883789063" Y2="412,0654296875" />
      <LineGeometry X1="493,34228515625" Y1="439,4326171875" X2="486,149658203125" Y2="412,589233398438" />
      <LineGeometry X1="493,34228515625" Y1="439,4326171875" X2="483,1494140625" Y2="418,533813476563" />
    </GeometryGroup>
  </surve>
  <polyline Name="polyline_3">
    <point X="1040" Y="1039" />
    <point X="1046" Y="1040" />
    <point X="1054" Y="1036" />
    <point X="1071" Y="1023" />
  </polyline>
<line Name="line_4" X1="156" Y1="333" X2="246" Y2="237" />
</gfx>

Генератор XML на Silverligth

StringWriter sw = new StringWriter();
            XmlWriterSettings settings = new XmlWriterSettings();
            settings.Indent = true;
            //settings.NewLineOnAttributes = true;
            settings.ConformanceLevel = ConformanceLevel.Document;
            settings.OmitXmlDeclaration = true;

            using (XmlWriter xml = XmlWriter.Create(sw, settings))
            {
                xml.WriteStartDocument();
                xml.WriteComment("Создано WebPiket ver " + version);
                xml.WriteStartElement("gfx");
                        xml.WriteStartElement("line");

                        xml.WriteStartAttribute("name");
                        xml.WriteString(ln.Name);
                        xml.WriteEndAttribute();

                        xml.WriteStartAttribute("x1");
                        xml.WriteString(ln.X1.ToString());
                        xml.WriteEndAttribute();

                        xml.WriteStartAttribute("y1");
                        xml.WriteString(ln.Y1.ToString());
                        xml.WriteEndAttribute();

                        xml.WriteStartAttribute("x2");
                        xml.WriteString(ln.X2.ToString());
                        xml.WriteEndAttribute();

                        xml.WriteStartAttribute("y2");
                        xml.WriteString(ln.Y2.ToString());
                        xml.WriteEndAttribute();

                        xml.WriteEndElement();
                xml.WriteEndElement();//gfx  
            }

суббота, 7 августа 2010 г.

Обработка ComboBox в Adobe Flash CS3 ActionScript3

У нас есть три слоя
на слое ComboBox будет жить наш элемент длина его должна быть на все кадры,
второй слой - Карты наши элементы которые будут отображаться при выборе из списка комбобокса, Слой скрипт на каждый кадр содержит строку 
stop();


в верхней правой части на слое ComboBox  Создадим элемент ComboBox из панели компоненты, назовем его ComboBoxMap1.

в свойствах зададим два элемента
в параметр data номер переключаемого кадра
теперь делаем обработчик события при изменении значения комбобокса в слое ComboBox  

import fl.controls.ComboBox;

ComboBoxMap1.selectedIndex=0;
// Добавляем созданного нами слушателя в список слушателей данного комбобокса
ComboBoxMap1.addEventListener("change", cbListener);

stop();

// Подписываем функцию на событие "изменен"(т.е. выбран какой-либо пункт)
function cbListener(event_obj:Event):void 
{
 // Переходим на выбранный кадр
 gotoAndStop(event_obj.target.selectedItem.data);
}