Рейтинг@Mail.ru

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
Читать далее...

WPF: Как запретить ввод в поле ввода любых символов, кроме целых чисел

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

Добавим в поле ввода 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

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

Чтобы создать простейший эффект изменения цвета фона элемента, создадим в разделе статических ресурсов:

<Color x:Key="selectedColor" A="255" R="191" G="191" B="204" />
<Color x:Key="originalColor" A="255" R="230" G="230" B="250" />
<SolidColorBrush x:Key="originalColorBrush" Color="{StaticResource originalColor}" />

Теперь для элемента настроим триггеры:

<Border Background="{StaticResource originalColorBrush}">
  <Border.Triggers>
    <EventTrigger RoutedEvent="Border.MouseEnter">
      <BeginStoryboard>
        <Storyboard>
          <ColorAnimation From="{StaticResource originalColor}" To="{StaticResource selectedColor}" Storyboard.TargetProperty="(Border.Background).(SolidColorBrush.Color)" Duration="0:0:0.5"  />
        </Storyboard>
      </BeginStoryboard>
    </EventTrigger>
  </Border.Triggers>
  …
</Border>
Читать далее...

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

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

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

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

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

RenderOptions.BitmapScalingMode="NearestNeighbor"
Читать далее...

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

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

Почему 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. Это касается и других элементов графического интерфейса, источниками которых являются коллекции, списки или массивы.

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

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

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

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

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

<Element PreviewMouseWheel="scrollingTest">

Код (VB.NET):

''' <summary>
''' Обеспечивает прокрутку родительского ScrollViewer с помощью среднего колеса мыши.
''' </summary>
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
Читать далее...

Реализация ObservableCollection в WPF

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

1. Класс должен реализовывать интерфейс INotifyPropertyChanged:

Public Class MainWindow
    Implements INotifyPropertyChanged

Public Event PropertyChanged(ByVal sender As Object, ByVal e As PropertyChangedEventArgs) Implements INotifyPropertyChanged.PropertyChanged

Public Sub NotifyPropertyChanged(ByVal propName As String)
    RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs(propName))
End Sub

2. Перечислимое свойство должно быть типа System.Collections.ObjectModel.ObservableCollection:

	
Public Property MyCollection As ObservableCollection(Of SingleStep) 
Читать далее...
Subscribe to this RSS feed