Рейтинг@Mail.ru

Распаковка файла из ресурсов в директорию приложения

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

Часто в приложении бывает необходимо использовать объёмные ресурсы, например, динамические библиотеки. Их можно включить в ресурсы приложения в сжатом виде. .NET имеет встроенный архиватор GZip. Его можно использовать, например, так:

''' 
''' Проверяет наличие необходимых DLL в текущей директории и при отсутствии создаёт.
''' 
Private Sub CheckDlls()
    Dim dlls As New Dictionary(Of String, Byte()) From {
        {"myLib1.dll", My.Resources.myLib1},
        {"myLib2.dll", My.Resources.myLib2}
    }
    For Each dll In dlls
        If (Not IO.File.Exists(dll.Key)) Then
            Using compressed As New IO.MemoryStream(dll.Value),
            gzStm As New IO.Compression.GZipStream(compressed, IO.Compression.CompressionMode.Decompress),
            decompressed As IO.FileStream = IO.File.Create(dll.Key)

                gzStm.CopyTo(decompressed)

            End Using
        End If
    Next

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

WPF: выделение текста в TextBox при получении фокуса ввода

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

Для начала необходимо добавить два метода в интереующее поле ввода: один будет отменять ввод нажатий мыши, а другой будет по получению фокуса выделять весь текст.

<TextBox PreviewMouseDown="IgnoreMouseButton" GotFocus="TextBox_GotFocus">

Вот реализация данных методов:

Private Sub TextBox_GotFocus(sender As Object, e As RoutedEventArgs)
    Dim tb As TextBox = TryCast(sender, TextBox)
        If (tb IsNot Nothing) Then
            tb.SelectAll()
        End If
    End Sub

Private Sub IgnoreMouseButton(sender As Object, e As MouseButtonEventArgs)
    Dim tb As TextBox = TryCast(sender, TextBox)
    If (tb IsNot Nothing) Then
        If (Not tb.IsKeyboardFocusWithin) Then
            e.Handled = True
            tb.Focus()
        End If
    End If
End Sub
Читать далее...

Управление измерительными приборами Rohde-Schwarz по интерфейсу RSIB

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

Измерительная аппаратура компании Rohde&Schwarz – это профессиональная аппаратура, которая используется в рабочих процессах на многих предприятиях по всему миру. Зачастую необходимо обеспечивать удалённый доступ и управление измерениями и режимами работы измерительной аппаратуры. Для этого у приборов Rohde&Schwarz есть, как правило, несколько возможностей. Одна из них – интерфейс RSIB. Рассмотрим его подробнее.

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

Изменяемая асинхронно наблюдаемая коллекция ObservableCollection

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

Наблюдаемые коллекции ObservableCollection в WPF можно изменять толкько в потоке пользовательского интерфейса. Однако можно несколько изменить данную коллекцию таким образом, чтобы можно было это делать из фонового потока. Например, вот так:

Imports System
Imports System.Collections.Generic
Imports System.Collections.ObjectModel
Imports System.Collections.Specialized
Imports System.Diagnostics
Imports System.Windows.Threading

Public Class ObservableCollectionThreadSafe(Of T)
    Inherits ObservableCollection(Of T) 'наследуем от наблюдаемой коллекции

    'Переопределяем событие изменения коллекции
    Public Shadows Event CollectionChanged As NotifyCollectionChangedEventHandler

#Region "КОНСТРУКТОРЫ"

    Public Sub New()
        MyBase.New()
    End Sub

    Public Sub New(items As IEnumerable(Of T))
        MyBase.New(items)
    End Sub

#End Region '/КОНСТРУКТОРЫ

    Protected Overrides Sub OnCollectionChanged(e As NotifyCollectionChangedEventArgs)
        Using MyBase.BlockReentrancy() 'используем BlockReentrancy(), который запрещает выполнение повторных попыток изменения коллекции
            Dim eventHandler As NotifyCollectionChangedEventHandler = Me.CollectionChangedEvent
            If (eventHandler IsNot Nothing) Then
                Dim delegates As [Delegate]() = eventHandler.GetInvocationList()
                For Each handler As NotifyCollectionChangedEventHandler In delegates 'идём по списку вызовов 
                    Dim dispatcherObject As DispatcherObject = TryCast(handler.Target, DispatcherObject)
                    If (dispatcherObject IsNot Nothing) AndAlso (Not dispatcherObject.CheckAccess()) Then 'Если подписчик - DispatcherObject И другой поток
                        dispatcherObject.Dispatcher.Invoke(DispatcherPriority.DataBind, handler, Me, New Object() {e}) 'вызываем обработчик в целевом потоке диспетчера
                    Else
                        handler(Me, e) 'иначе запускаем обработчик как есть
                    End If
                Next
            End If
        End Using
    End Sub

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

Реализация интерфейса 1-Wire на микросхемах FTDI

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

С интерфейсом 1-Wire мы сталкиваемся ежедневно: он применяется для чтения ключей-«таблеток» от домофона. Микросхемы фирмы FTDI (FT2232, FT4232 и другие) не поддерживают реализацию интерфейса 1-Wire «из коробки». Но программно можно реализовать его самостоятельно. Чем и займёмся в статье.
Читать далее...

Observable collection с уведомлением при добавлении диапазона значений

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

В .NET есть такой перечислимый тип как ObservableCollection. Его особенность в том, что эта коллекция при изменении её элементов (добавлении или удалении), уведомляет наблюдающие за ней классы об этом изменении. Это бывает полезно, например, когда к данной коллекции привязаны элементы пользовательского интерфейса. Но если необходимо добавить в коллекцию сразу множество элементов, то добавление каждого элемента будет уведомлять об изменении коллекции каждый раз. Это вызовет избыточную нагрузку на пользовательский интерфейс, и он может даже зависнуть на какое-то время. Чтобы этого избежать, можно написать свой собственный класс, который будет наследовать от ObservableCollection и содержать метод добавления множества элементов за один раз, а уведомлять об этом единожды. Вот как например это можно сделать:

Imports System.Collections.Specialized

''' <summary>
''' ObservableCollection с поддержой добавления множества элементов.
''' </summary>
Public Class ObservableRangeCollection(Of T)
    Inherits ObjectModel.ObservableCollection(Of T)

#Region "CTORs"

    Public Sub New()
        MyBase.New()
    End Sub

    Public Sub New(collection As IEnumerable(Of T))
        MyBase.New(collection)
    End Sub

#End Region '/CTORs

#Region "METHODS"

    ''' <summary>
    ''' Добавляет в коллекцию несколько элементов и в конце уведомляет об этом.
    ''' </summary>
    Public Sub AddRange(collection As IEnumerable(Of T))
        For Each item As T In collection
            Items.Add(item)
        Next
        OnCollectionChanged(New NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Add, collection))
    End Sub

#End Region '/METHODS

End Class

По аналогии с методом AddRange можно добавить методы для удаления, вставки или перемещения набора элементов коллекции.

Читать далее...
Subscribe to this RSS feed