Рейтинг@Mail.ru

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

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

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

<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

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

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

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

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

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

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

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

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

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

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

В 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

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

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) 
Подробнее ...

Перенос текста TextWrapping в XAML

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

Зачастую нужно чтобы текст переносился на следующую строку, занимая всю ширину родительского элемента. За это отвечает свойство TextWrapping.Распространённые случаи:

<ListView HorizontalContentAlignment="Stretch" ScrollViewer.HorizontalScrollBarVisibility="Disabled">

Элементы ListViewItem при этом должны быть типа TextBlock, а горизонтальная полоса прокрутки HorizontalScrollBar отключена.

Или другой случай:

<GroupBox.Header>
  <TextBlock TextWrapping="Wrap" Width="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type GroupBox}}, Path=ActualWidth}" />
</GroupBox.Header>

Вместо GroupBox.Header может быть любой контейнер. Важно, что ширина устанавливается с помощью привязки к актуальной ширине ActualWidth родителя.

Подробнее ...
Подписаться на этот канал RSS