Рейтинг@Mail.ru
aave

aave

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

Published in Программирование

Print Friendly, PDF & Email

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

Print Friendly, PDF & Email
Читать далее...
Print Friendly, PDF & Email

Когда режим выделения элементов списка в 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
Print Friendly, PDF & Email
Читать далее...
Print Friendly, PDF & Email

Создатели программы 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.

Кстати, если вам нужно подключиться в режиме только просмотра, без управления, то нужно в параметрах запуска RAdmin.exe добавить ключ /noinput.

Print Friendly, PDF & Email
Читать далее...
Print Friendly, PDF & Email

Это может понадобиться, например, при реализации функциональности 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
Print Friendly, PDF & Email
Читать далее...
Subscribe to this RSS feed