Цены на Windows Azure

вторник, 14 июля 2009 г.,

Windows Azure:
  • Compute = $0.12 / hour
  • Storage = $0.15 / GB stored / month
  • Storage Transactions = $0.01 / 10K
  • Bandwidth = $0.10 in / $0.15 out / GB
SQL Azure (прежнее название SQL Services):
  • Web Edition – Up to 1 GB relational database = $9.99 / month
  • Business Edition – Up to 10 GB relational database = $99.99 / month
  • Bandwidth = $0.10 in / $0.15 out / GB
.Net Services:
  • Messages = $0.15/100K message operations , including Service Bus messages and Access Control tokens
  • Bandwidth = $0.10 in / $0.15 out / GB
Вполне нормальные цены. Подробнее здесь.
Описание T-SQL для SQL Azure здесь.

NotifyIcon в WPF приложении

суббота, 11 июля 2009 г.,

Задача: после запуска WPF Application в system tray, т.е. в правом нижнем углу экрана должна появиться иконка; при щелчке мышью по иконке надо показать окно; закрытие окон не должно приводить к закрытию приложения.

Реализовать иконку в system tray можно с помощью NotifyIcon; для этого в References проекта WPF Application надо:
  1. добавить сборку System.Windows.Forms.dll
  2. в App.xaml у тега Application убрать атрибут StartupUri
  3. в App.cs в class App добавить конструктор
    public App()
    {
        // закрытие всех окон приложения не приводит к его завершению
        this.ShutdownMode = ShutdownMode.OnExplicitShutdown;

        // создать иконку и поместить ее в system tray
        var ni = new System.Windows.Forms.NotifyIcon();
        ni.Visible = true;
        ni.Icon = WpfApplication6.Properties.Resources.Icon1;

        ni.Click += (s, _) =>
        {
            // создать и показать окно
            var uri = new Uri("Window1.xaml", UriKind.Relative);
            var wnd = Application.LoadComponent(uri) as Window;
            wnd.Visibility = Visibility.Visible;
            wnd.ShowInTaskbar = false;
        };

        // определить контекстное меню
        ni.ContextMenu = new System.Windows.Forms.ContextMenu(new[]
        {
            // завершить приложение
            new System.Windows.Forms.MenuItem("Exit", delegate
            {
                ni.Visible = false;
               this.Shutdown();
            })
        });
    }
Надо заметить, что если приложение будет закрыто по ошибке или из дебаггера, то иконка останется в system tray до тех пор пока над ней не окажется курсор мыши.

Silverlight 3 стал RTW = выпущен

пятница, 10 июля 2009 г.,

На сайте Microsoft доступны:

Gazelle - принципиально новый браузер Microsoft

вторник, 7 июля 2009 г.,

Газель - Microsoft Gazelle Web Browser - браузер построен как многозадачная операционная система.

Gazelle был анонсирован в феврале 2009; будет представлен в августе на конференции Usenix Security Symposium.

Ядро Gazelle написано на C#. Компоненты взаимодействуют друг с другом посредством посылки асинхронных xml-сообщений. Парсер HTML, Renderer и JavaScript Engine взяты от Internet Explorer. Подробнее здесь (PDF file), а также см.:

Как изменить поведение RichTextBox при нажатии Enter

понедельник, 6 июля 2009 г.,

Обычно при нажатии Enter в RichTextBox создается новый параграф, который отделяется от предыдущего пустой строкой. Например, если набрать Hello, World!, поместить курсор перед World и нажать Enter, то получим:

Hello,

World!
При этом в RichTextBox.Document будет следующий xaml:
<FlowDocument>
  <Paragraph xml:space="preserve">Hello, </Paragraph>
  <Paragraph>World!</Paragraph>
</FlowDocument>
Чтобы избавиться от пустой строки можно подписаться на событие PreviewKeyDown и перехватывать момент нажатия:
void _Rtb_PreviewKeyDown(object sender, KeyEventArgs e)
{
    if (e.Key == Key.Return)
    {
        _Rtb.CaretPosition = _Rtb.CaretPosition.InsertLineBreak();
        e.Handled = true;
    }
}
Другой способ - определить стиль. Для этого в RichTextBox надо добавить FlowDocument и FlowDocument.Resources:
<FlowDocument>
  <FlowDocument.Resources>
    <Style TargetType="Paragraph">
      <Setter Property="Margin" Value="0" />
      <Setter Property="Padding" Value="0" />
    </Style>
  </FlowDocument.Resources>
</FlowDocument>

WPF: Перехват нажатия Enter в RichTextBox


Дано:
<UserControl x:Class="Editor.TextEditor"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"    >
  <RichTextBox x:Name="_Rtb"
    VerticalScrollBarVisibility="Visible" Padding="5"
    HorizontalScrollBarVisibility="Auto"  FontSize="13.5" FontFamily="Verdana" Background="#FFFADF" Foreground="Black" >
    <FlowDocument>
      <Paragraph>
        Hello, World!
      </Paragraph>
    </FlowDocument>
  </RichTextBox>
</UserControl>
Надо перехватить нажатие Enter. Для этого в конструкторе TextEditor пишем:
EventManager.RegisterClassHandler(typeof(RichTextBox), RichTextBox.KeyDownEvent, new KeyEventHandler(_Rtb_KeyDown));
где _Rtb_KeyDown - это:
void _Rtb_KeyDown(object sender, KeyEventArgs e)
{
    if (e.Key == Key.Return)
    {
    }
}
P.S.
Обычный способ:
_Rtb.KeyDown += new KeyEventHandler(_Rtb_KeyDown);
не работает (= Enter не перехватывает).

P.P.S.
Нажатие Enter также можно перехватить с помощью события PreviewKeyDown:
_Rtb.PreviewKeyDown += new KeyEventHandler(_Rtb_PreviewKeyDown);

Как определить префикс у имени XAttribute

вторник, 30 июня 2009 г.,

Если требуется программно создать xml:
<Grid>
  <Style x:Key="Style1">
    <Setter Property="Rectangle.Fill" Value="Yellow" />
  </Style>
</Grid>
то это можно сделать следующим образом:
XNamespace ns = "http://schemas.microsoft.com/winfx/2006/xaml";
var grid = new XElement("Grid",
    new XAttribute(XNamespace.Xmlns + "x", ns),
    new XElement("Style",
        new XAttribute(ns.GetName("Key"), "Style1"),
        new XElement("Setter",
            new XAttribute("Property", "Rectangle.Fill"),
            new XAttribute("Value", "Yellow")
            )
        )
    );
Определять XAttribute у Grid - обязательно, иначе в теге Style у атрибута Key получим другой префикс:
<Style p2:Key="Style1" xmlns:p2="http://schemas.microsoft.com/winfx/2006/xaml">
Тоже самое произойдет, если у тега Style вызвать метод Remove().

P.S.
Для того чтобы добавить xmlns="..." в Grid:
XNamespace xmlns = "http://schemas.microsoft.com/winfx/2006/xaml/presentation";
var grid = new XElement(xmlns.GetName("Grid"), ...