Рейтинг@Mail.ru

Что делать если изображение видно в редакторе 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
Читать далее...

WPF: Как найти визуального родителя заданного элемента UIElement (VB.NET)

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

Для поиска родителя любого UIElement на странице, напишем такой метод:

''' <summary>'
''' Возвращает визуального родителя заданного типа.'
''' </summary>'
''' <param name="child">Элемент, для которого нужно найти визуального родителя.'
''' <typeparam name="T">Тип искомого родителя.'
Public Shared Function FindVisualParent(Of T As DependencyObject)(ByVal child As DependencyObject) As T
    Dim parentObject As DependencyObject = VisualTreeHelper.GetParent(child)
    If (parentObject Is Nothing) Then
        Return CType(Nothing, T)
    End If
    Dim parent As T = TryCast(parentObject, T)
    If (Not parent Is Nothing) Then
        Return parent
    End If
    Return FindVisualParent(Of T)(parentObject)
End Function
Читать далее...
Subscribe to this RSS feed