Рейтинг@Mail.ru

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

Published in Полезные советы

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

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

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

<Menu Background="{StaticResource sysColor}"></Menu>
Читать далее...

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

Published in Полезные советы

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

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

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

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

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

Published in Полезные советы

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

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

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

<DataTemplate x:Key="lvDataTemplate">
    <TextBlock Text="{Binding}" TextWrapping="Wrap" />
</DataTemplate>
Читать далее...

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

Published in Полезные советы

Чтобы подогнать ширину всех столбцов таблицы 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

Published in Полезные советы

Сначала в разделе ресурсов создадим целочисленный массив, не забыв импортировать пространство имён 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}" />
Читать далее...

WPF: Как использовать свойство объекта в качестве параметра конвертера IValueConverter.ConverterParameter

Published in Программирование

Допустим, у нас есть объект MyObject со свойствами MyData и MyProperty. Для его отображения в графическом пользовательском интерфейсе, построенном на XAML, мы хотим использовать эти два свойства, преобразовав MyData с помощью IValueConverter, а MyProperty использовать в качестве параметра конвертера ConverterParameter. Реально ли это?

Читать далее...

WPF: Выделение элемента ListBoxItem и сброс выделения при повторном нажатии

Published in Полезные советы

Когда режим выделения элементов списка в XAML SelectionMode="Multiple", элемент выделяется по нажатию «мышью», и таким же образом сбрасывается выделение. В режиме Single выделение сбрасывается только при переключении на другой элемент или при удерживании клавиши Ctrl. Но что если нужно нечто среднее: выделение и снятие выделения элемента ListBoxItem по нажатию кнопкой «мыши», но выделение возможно только одного элемента?

Предлагаю такой вариант решения: задать списку ListBox или ListView множественный режим выделения и запрещать выделение более чем одного элемента. Сделаем это так (код на VB.NET):

''' <summary>'
''' Запрещает выделение множества элементов ListViewItem, когда режим выделения – Multiple.'
''' </summary>'
''' <remarks>Реализует поведение снятия выделения по второму клику на элементе, чтобы не нужно было удерживать Ctrl для снятия выделения.</remarks>'
Private Sub forbidSelectionButOne(sender As Object, e As MouseButtonEventArgs)
    Dim lv As ListView = TryCast(sender, ListView)
    If lv IsNot Nothing Then
        If lv.SelectedIndex <> getCausesListViewItemIndex(sender, e) Then
            lv.SelectedIndex = getCausesListViewItemIndex(sender, e)
            e.Handled = True
        End If
        lv.Focus()
    End If
End Sub
''' <summary>'
''' Возвращает индекс элемента списка, который был нажат мышью.'
''' </summary>'
Private Function getCausesListViewItemIndex(ByVal sender As Object, e As RoutedEventArgs) As Integer
    Dim dep As DependencyObject = TryCast(e.OriginalSource, DependencyObject)
    Do While dep IsNot Nothing AndAlso Not TypeOf (dep) Is ListViewItem
        dep = VisualTreeHelper.GetParent(dep)
    Loop
    If dep Is Nothing Then
        Return -1
    Else
        Dim lv As ListView = TryCast(sender, ListView)
        If lv IsNot Nothing Then
            Dim i As Integer = lv.ItemContainerGenerator.IndexFromContainer(dep)
            Return i
        Else
            Return -1
        End If
    End If
End Function
Читать далее...

WPF: Как получить объект из списка ListBox под указателем мыши

Published in Полезные советы

Это может понадобиться, например, при реализации функциональности DragAndDrop. Напишем метод, возвращающий объект или NULL, если объекта нет:

''' <summary>'
''' Возвращает элемент списка ListBox, находящийся под указателем мыши.'
''' </summary>'
''' <param name="lb">Список.'
''' <param name="p">Позиция курсора. Обычно e.GetPosition(lb), где е type of DragEventArgs.'
Private Function getDataFromListBox(ByVal lb As ListBox, ByVal p As Point) As Object
  Dim element As UIElement = TryCast(lb.InputHitTest(p), UIElement)
  If element IsNot Nothing Then
    Dim data As Object = DependencyProperty.UnsetValue
      Do While data Is DependencyProperty.UnsetValue
        data = lb.ItemContainerGenerator.ItemFromContainer(element)
        If data Is DependencyProperty.UnsetValue Then
          element = CType(VisualTreeHelper.GetParent(element), UIElement)
         End If
       Loop
       If data IsNot DependencyProperty.UnsetValue Then
         Return data
       End If
     End If
   Return Nothing
End Function
Читать далее...
Subscribe to this RSS feed