Показаны сообщения с ярлыком WPF. Показать все сообщения
Показаны сообщения с ярлыком WPF. Показать все сообщения

WPF: загрузка html в WebBrowser из ресурсов

среда, 15 июля 2009 г.,

Есть следующий xaml, в котором определен WebBrowser:
<Window x:Class="WpfApplication6.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="Window1" Height="300" Width="300">
  <WebBrowser x:Name="_Wb" Margin="20" />
</Window>
Требуется загрузить в WebBrowser содержимое файла, например, Content.htm, который добавлен в проект как ресурс (т.е. в свойствах файла указан Build Action: Resource).
Для этого в конструктор класса Window1 надо добавить следующий код:
Uri uri = new Uri(@"pack://application:,,,/Content.htm", UriKind.Absolute);
Stream source = Application.GetResourceStream(uri).Stream;
_Wb.NavigateToStream(source);

P.S.
Ресурсный файл Content.htm можно сделать "подфайлом" для Window.xaml, т.е. Content.htm станет соседом для Window.xaml.cs; для этого надо в файле проекта (файл с расширением .csproj) заменить
<Resource Include="Window1.htm" />
на
<Resource Include="Window1.htm">
    <DependentUpon>Window1.xaml</DependentUpon>
</Resource>
В Visual Studio в появившемся диалоге "File Modification Detected" нажать Reload.

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 до тех пор пока над ней не окажется курсор мыши.

Как изменить поведение 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);