Рейтинг@Mail.ru

WPF: Как сохранить элемент управления FrameworkElement() в виде изображения

Опубликовано в Полезные советы

Допустим, нам нужно сохранить какой-то элемент управления в окне WPF в изображение. Можно сделать это, например, так.

Сначала сгенерируем изображение с помощью класса RenderTargetBitmap(), запишем его в поток в памяти, прочитаем и сохраним в объект типа String():

''' <summary>
''' Генерирует строку, представляющую поток изображения, из FrameworkElement.
''' </summary>
''' <param name="elem">Элемент, который будет преобразован в изображение.</param>
Private Function GetElementAsString(ByVal elem As FrameworkElement) As String    
    Dim w As Integer = CInt(elem.ActualWidth)
    Dim h As Integer = CInt(elem.ActualHeight)
    Dim renderBitmap As New RenderTargetBitmap(w, h, 96, 96, PixelFormats.Default)
    renderBitmap.Render(elem)

    Dim pngEncoder As New PngBitmapEncoder()
    pngEncoder.Frames.Add(BitmapFrame.Create(renderBitmap))

    Dim pngStr As String = String.Empty
    Using ms As New IO.MemoryStream()
        pngEncoder.Save(ms)
        ms.Seek(0, IO.SeekOrigin.Begin)
        Using sr As New IO.StreamReader(ms, Text.Encoding.Default)
            pngStr = sr.ReadToEnd
        End Using
    End Using
    Return pngStr
End Function

Напишем метод для сохранения изображения в файл:

''' <summary>
''' Сохраняет строку с данными изображения в файл PNG с заданным именем.
''' </summary>
''' <param name="fileName">Имя файла с расширением PNG, под которым будет сохранено изображение.</param>
''' <param name="imgStr">Строка, представляющая изображение.</param>
Private Sub SaveElementAsImage(ByVal fileName As String, ByVal imgStr As String)
    Using fs As New IO.FileStream(fileName, IO.FileMode.Create)
        Using sw As New IO.StreamWriter(fs, Text.Encoding.Default)
            sw.Write(imgStr)
        End Using
    End Using
End Sub

Теперь мы можем сохранить изображение в файл, используя предыдущие два метода:

Dim pngStr As String = GetElementAsString(MyControlToSave)
SaveElementAsImage("1.png", "Рисунок 1")
Подробнее ...

WPF: Использование системных цветов

Опубликовано в Полезные советы

Для использования системных цветов в XAML необходимо объявить цвет в секции ресурсов:

<Window.Resources>
    <SolidColorBrush x:Key="sysColor" Color="{DynamicResource {x:Static SystemColors.ControlColorKey}}" />
</Window.Resources>

А затем его можно использовать в разметке так:

<Menu Background="{StaticResource sysColor}"></Menu>
Подробнее ...

WPF: Изменение источника элементов при изменении свойства

Опубликовано в Полезные советы

Чтобы динамически изменять коллекцию – источник привязки, можно воспользоваться триггерами данных DataTrigger:

<Style TargetType="ComboBox" x:Key="comboSourceStyle">
  <Style.Triggers>
    <DataTrigger Binding="{Binding Speed}" Value="0">
      <Setter Property="ItemsSource" Value="{StaticResource MyCollection1}" />
    </DataTrigger>
    <DataTrigger Binding="{Binding Speed}" Value="1">
      <Setter Property="ItemsSource" Value="{StaticResource MyCollection2}" />
    </DataTrigger>
  </Style.Triggers>
</Style>
Подробнее ...

WPF: Перемещение фокуса ввода на произвольный элемент GUI

Опубликовано в Полезные советы

Dim tr As New TraversalRequest(FocusNavigationDirection.Last)
MoveFocus(tr)

Это может помочь в случае, когда, например, нужно обновить поля ввода TextBox при срабатывании кнопки по умолчанию по нажатию Enter на клавиатуре.

Подробнее ...

Что делать если изображение видно в редакторе XAML, но при выполнении приложения - нет

Опубликовано в Полезные советы

У вас ситуация: в редакторе XAML в Visual Studio вы задали визуальный элемент Image, который использует картинку из папки проекта. Вы видите её в редакторе, всё нормально. Но стоит запустить скомпилированное приложение – и изображения в нём не видно. Что делать?

Иногда помогает очистка решения и перекомпиляция: Построение Очистить, Построение Перестроить проект.

Если не помогло, кликаем правой кнопкой мыши на изображении в обозревателе решений, выбираем Свойства, в открывшейся панели свойств идём в Действия при сборке (BuildActions) "Нет" меняем на Ресурс (Resource).

Панель свойств изображения в Visual Studio 2013
Подробнее ...

XAML: Почему текст в ListView не переносится на новую строку

Опубликовано в Полезные советы

По умолчанию, если ширина элемента списка ListView больше, чем ширина списка, его содержимое не переносится на новую строку. Чтобы перенос происходил, нужно использовать шаблон DataTemplate, применённый к элементу списка:

<ListView ItemsSource="{Binding myCollection}" ItemTemplate="{StaticResource lvDataTemplate}" />

Шаблон будет таким:

<DataTemplate x:Key="lvDataTemplate">
    <TextBlock Text="{Binding}" TextWrapping="Wrap" />
</DataTemplate>
Подробнее ...

WPF: Как подогнать ширину столбцов GridView под содержимое элементов

Опубликовано в Полезные советы

Чтобы подогнать ширину всех столбцов таблицы GridView под ширину содержимого можно воспользоваться таким решением:

For Each gvc As GridViewColumn In myListView.View.Columns
    If Double.IsNaN(gvc.Width) Then
        gvc.Width = gvc.ActualWidth
        gvc.Width = Double.NaN
    End If
Next
Подробнее ...

WPF: Как привязать ComboBox к целочисленному массиву в XAML

Опубликовано в Полезные советы

Сначала в разделе ресурсов создадим целочисленный массив, не забыв импортировать пространство имён mscorlib:

<Window xmlns:sys="clr-namespace:System;assembly=mscorlib">
    <Window.Resources>

        <x:Array Type="{x:Type sys:Int32}" x:Key="refreshPeriods">
            <sys:Int32>100</sys:Int32>            
            <sys:Int32>500</sys:Int32>
            <sys:Int32>1000</sys:Int32>
            <sys:Int32>2000</sys:Int32>
        </x:Array>

И теперь используем ComboBox так:

<ComboBox ItemsSource="{StaticResource refreshPeriods}" SelectedValue="{Binding UpdateDiagramTimerPeriod, Mode=TwoWay}" />
Подробнее ...
Подписаться на этот канал RSS