Рейтинг@Mail.ru

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

Опубликовано в Программирование

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

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

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

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

Это может понадобиться, например, при реализации функциональности 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: Как запретить ввод в поле ввода любых символов, кроме целых чисел

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

Добавим в поле ввода TextBox обработчик нажатий клавиатуры:

<TextBox PreviewTextInput="checkIfInputDigits" />

А вот код самого обработчика (VB.NET):

Private Sub checkIfInputDigits(sender As Object, e As TextCompositionEventArgs)
    Dim re As New Regex("^[0-9]+") 'объявим регулярное выражение, 
    которое соответствует непрерывной последовательности чисел от 0 до 9'
    e.Handled = Not re.IsMatch(e.Text) 'запрещаем ввод символов.'
End Sub
Подробнее ...

Эффект тени и размытие элементов в XAML

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

XAML поддерживает множество эффектов. Например, эффект тени:

<StackPanel.Effect>
  <DropShadowEffect Opacity="0.5" RenderingBias="Performance" Direction="315" ShadowDepth="3" BlurRadius="3" />
</StackPanel.Effect>

После добавления эффекта тени возможно размытие (blur) текста и других элементов. Чтобы устранить этот эффект, нужно задать свойство родительского элемента

RenderOptions.BitmapScalingMode="NearestNeighbor"
Подробнее ...

Как переместить элемент списка List(Of T) или ObservableCollection на другую позицию

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

Для наблюдаемой коллекции ObservableCollection:

MyCollection.Move(MyCollection.IndexOf(myItem), newIndex) 'перемещение элемента на заданную позицию'

Для списков List(of T):

myItemCopy = myItem.GetCopy() 'создаём копию объекта, реализация не представлена'
MyCollection.Remove(myItem) 'удаляем заданный элемент'
MyCollection.Insert(newIndex, myItemCopy) 'вставляем копию элемента на заданную позицию'
Подробнее ...

Почему ComboBox сбрасывает выбранный элемент SelectedItem при двунаправленной привязке?

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

Почему ComboBox может сбрасывать выбранный элемент SelectedItem при двунаправленной привязке, хотя вроде бы всё сделано верно? Например, есть такая XAML разметка:

<ComboBox SelectedItem="{Binding MySelectedItem, Mode=TwoWay}" ItemsSource="{Binding MyList, Mode=OneWay}" />

Так привязка работать не будет. А вот так будет:

<ComboBox ItemsSource="{Binding MyList, Mode=OneWay}" SelectedItem="{Binding MySelectedItem, Mode=TwoWay}" />

Несмотря на практически идентичную разметку, первый кусок кода работает не так, как ожидается.

Нюанс в том, что парсер XAML-разметки разбирает код последовательно. Если сначала объявлена привязка выделенного элемента SelectedItem, а после – источник данных для ComboBox, то при загрузке окна и построении графического интерфейса GUI всегда будет выбран первый элемент (ComboBox.SelectedIndex=0).

Поэтому следует всегда объявлять сначала источник элементов списка ComboBox.ItemsSource, а потом привязку выделенного элемента ComboBox.SelectedItem. Это касается и других элементов графического интерфейса, источниками которых являются коллекции, списки или массивы.

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

Как настроить останов отладки Visual Studio при возникновении конкретного типа исключения

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

Для настройки останова процесса отладки при возникновении определённого типа исключения, нужно сделать следующее.

Открыть в меню Отладка – Исключения (Debugging – Exceptions) или нажать сочетание клавиш Ctrl+Alt+E.

Открываем окно «Исключения»
Открываем окно «Исключения»

Нажать кнопку Найти и ввести часть имени или полное название исключения:

Найти название исключения
Поиск исключения по названию

Выбрать в древовидном списке исключений желаемые и нажать OK:

Выбрать в древовидном списке исключений желаемое
Выбор типа исключения

Теперь отладка будет остановлена в момент возникновения данного типа исключения и показана отладочная информация.

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

Как передать событие родительскому элементу страницы XAML

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

Данный пример передаёт событие прокрутки среднего колеса мыши родительскому элементу:

В XAML присвоим имя событию:

<Element PreviewMouseWheel="scrollingTest">

Код (VB.NET):

''' <summary>'
''' Обеспечивает прокрутку родительского ScrollViewer с помощью среднего колеса мыши.'
''' </summary>'
''' <remarks></remarks>'
Private Sub scrollingTest(sender As Object, e As MouseWheelEventArgs)
  e.Handled = True 'перехват события'
  Dim e2 As MouseWheelEventArgs = New MouseWheelEventArgs(e.MouseDevice, e.Timestamp, e.Delta) 'получаем свойства события'
  e2.RoutedEvent = UIElement.MouseWheelEvent 
  MainWindow.MyScrollViewer.RaiseEvent(e2) 'передаём перехваченное событие родительскому скролл-вьюеру'
End Sub
Подробнее ...
Подписаться на этот канал RSS