Рейтинг@Mail.ru
Полезные советы

Полезные советы (27)

Короткие практические полезные советы из области ИТ.

Как отключить учётную запись в Windows 10

Чтобы отключить учётную запись пользователя в Windows 10 без её удаления, необходимо запустить консоль от имени Администратора. Для отключения введите в консоль:

net user USERNAME /active:yes

и нажмите Ввод (Enter). Здесь USERNAME – имя пользователя, учётную запись которого необходимо отключить.

Для отключения учётной записи:

net user USERNAME /active:no

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

Когда режим выделения элементов списка в 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

Как при подключении к серверу RAdmin автоматически вводить пароль

Создатели программы RAdmin принципиально не хотят добавлять в свою программу возможность сохранения пароля подключения, и его постоянно приходится вводить вручную. Одним из простых вариантов решения задачи автоматического ввода пароля может стать создание скрипта, который будет запускать исполняемый файл RAdmin, а затем посылать окну подключения имя пользователя и пароль.

  1. Добавить в системную переменную PATH директорию запуска radmin.exe.
  2. Создать скрипт VBS с таким содержимым:
set WshShell = WScript.CreateObject ("WScript.Shell")
WshShell.Run "Radmin.exe /connect:[hostname]:4899 /16bpp /updates:30"
WScript.Sleep 1000
WshShell.AppActivate "Система безопасности Radmin: [hostname]"
WScript.Sleep 500
WshShell.SendKeys "[username]{TAB}"
WScript.Sleep 100
WshShell.SendKeys "[pass]{ENTER}"

Здесь [hostname] – имя или IP-адрес компьютера в сети, [username], [pass] – имя пользователя и пароль для подключения. к серверу RAdmin.

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: Как найти визуального родителя заданного элемента UIElement (VB.NET)

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

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

Выделение объектов в AutoCAD без клавиши Shift

Как в AutoCAD изменить режим выбора объектов? Есть два режима:

  • при выделении мышью следующего объекта, он добавляется к выделенным;
  • при выделении мышью следующего объекта, выделение предыдущих снимается, и для выделения нескольких объектов нужно удерживать клавишу Shift.

За эту настройку отвечает переменная PICKADD. Чтобы её изменить, нужно последовательно ввести:

PICKADD
1

Если значение переменной "1", то при выделении мышью следующего объекта, он добавляется к выделенным. Если значение переменной "0", то при выделении мышью следующего объекта, выделение предыдущих снимается, и для выделения нескольких объектов нужно удерживать клавишу Shift.

Изменение переменной pickadd в AutoCAD
Изменение переменной pickadd в AutoCAD

Если включён режим динамического ввода ДИН, то можно просто набирать на клавиатуре команду. А если выключен – вводить нужно в поле команд.

Анимация изменения цвета фона элемента при наведении мыши в 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"

Как переместить элемент списка 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

Реализация 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) 
Подписаться на этот канал RSS