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

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

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

Сортировка SortedDictionary в порядке убывания

Print Friendly, PDF & Email

Чтобы создать отсортированный словарь в .NET имеется тип SortedDictionary. А что если нужно отсортировать словарь в порядке убывания? Для этой цели есть перегруженный вариант конструктора, который в качестве одного из параметров принимает объект типа Comparer:

Private MyDict As New SortedDictionary(Of Integer, Object)(Comparer(Of Integer).Create(Function(x, y) y.CompareTo(x)))

Comparer в конструкторе обращает порядок элементов, сортируя в порядке убывания ключей.

Print Friendly, PDF & Email

Как задать атрибут Icon для окна из кода

Print Friendly, PDF & Email

Чтобы задать иконку окна из ресурсов приложения, можно поступить так:

Dim w As New Window() With {
    .Icon = BitmapFrame.Create(Application.GetResourceStream(New Uri("Images/myIcon.ico", UriKind.RelativeOrAbsolute)).Stream)
}

Здесь Images/myIcon.ico – это путь к ресурсу иконки в структуре директорий проекта.

Print Friendly, PDF & Email

Ошибка DeferrableContent в XAML

Print Friendly, PDF & Email

При возникновении ошибки DeferrableContent, например:

Exception: Задание свойства "System.Windows.ResourceDictionary.DeferrableContent" вызвало исключение.: номер строки XX и позиция в строке YY.
InnerException: ArgumentException: Элемент уже добавлен. Ключ в словаре: "System.Windows.Controls.ComboBox"  Добавляемый ключ: 'System.Windows.Controls.ComboBox'

нужно ставить атрибут x:Key перед типом. Например:

Вместо:

<Style TargetType="ComboBox" x:Key="cmb1Style">
    <Setter Property="VerticalContentAlignment" Value="Center" />
</Style>

<Style TargetType="ComboBox" x:Key="cmb2Style">
    <Setter Property="VerticalContentAlignment" Value="Top" />
</Style>

Описывать так:

<Style x:Key="cmb1Style" TargetType="ComboBox">
    <Setter Property="VerticalContentAlignment" Value="Center" />
</Style>

<Style x:Key="cmb2Style" TargetType="ComboBox">
    <Setter Property="VerticalContentAlignment" Value="Top" />
</Style>
Print Friendly, PDF & Email

Как сохранить пробелы в XAML

Print Friendly, PDF & Email

Чтобы сохранить пробелы в разметке XAML, необходимо в нужном узле задать атрибут:

xml:space="preserve"

Далее использовать пробелы и/или символы переноса строки:

&#x0A;

x0A – это символ переноса строки в шестнадцатеричном фрмате в таблице символов ASCII с префиксом &#, который подсказывает это процессору XAML. Аналогичным образом можно использовать и другие непечатные символы из таблицы ASCII.

Например:

<TextBlock Text="Строка 1 &#x0A; Строка 2" xml:space="preserve" />
Print Friendly, PDF & Email

Как сделать перенос строки в XAML

Print Friendly, PDF & Email

Чтобы сохранить перенос строки в XAML:

    <sys:String x:Key="myString" xml:space="preserve">My String with &#13; carry return</sys:String>

Здесь:

&#13;
– символ переноса строки в таблице ASCII;
xml:space="preserve"
– директива, указывающя парсеру XAML, что пробельные символы нужно сохранить. Если её не указать, парсер удалит все «лишние» пробелы, в т.ч. переносы строк.
Print Friendly, PDF & Email

Как использовать тип BitVector32 в .NET

Print Friendly, PDF & Email

Если нужно оперировать отдельными битами и секциями битов в 32-разрядных числах, в .NET существует тип System.Collections.Specialized.BitVector32. Его использование сводится к тому, что сначала необходимо определить секции и/или маски. Маски используются для оперирования отдельными битами, а секции – для оперирования группами битов внутри числа.

Dim b0 As Integer = BitVector32.CreateMask() 'инициализация битовых масок - нулевой (младший) бит
Dim b1 As Integer = BitVector32.CreateMask(b0) '1-ый бит
Dim b2 As Integer = BitVector32.CreateMask(b1) '2-ой бит
            
Dim s0 As BitVector32.Section = BitVector32.CreateSection(1)   'бит 0
Dim s6_1 As BitVector32.Section = BitVector32.CreateSection(&B11_1111, s0)  'биты 1..6
Dim s8_7 As BitVector32.Section = BitVector32.CreateSection(&B11, s6_1)  'биты 7..8
Dim s9 As BitVector32.Section = BitVector32.CreateSection(1, s7_8)  'бит 9

Dim s1 As BitVector32.Section = BitVector32.CreateSection(1, s0) 'бит 1
Dim s9_2 As BitVector32.Section = BitVector32.CreateSection(&B1111_1111, s1) 'биты 2..9

Пример использования секций битов:

Dim vector As New BitVector32(&HFFFF) 'создаём 32-битный вектор и инициализируем числом 0xFFFF
vector(s6_1) = 26 'задаём значение для секции битов 1..6
vector(s9) = 1 'задаём значение для секции 9, т.е. 9-го разряда

Для управления отдельными битами:

vector(b0) = 0 'задаём значение "0" младшего (0-го) бита
vector(b1) = 1 'задаём значение "1" для 1-го бита

vector(s1) = 1 'то же, что и предыдущая строка, только доступ через секцию

Если вы присвоите секции значение, большее, чем определено количеством битов в секции, «лишние» биты будут отрезаны. Например, при попытке записать в секцию s6_1 число 92 (0101_1100), оно будет урезано до 6-ти бит, т.е. получится число 28 (01_1100).

В .NET также существует тип BitArray, обладающий похожей функциональностью. Разница в том, что размер числа не ограничен 32-мя разрядами, а отдельные биты представлены типом Boolean. Из-за этого он занимает больше места в памяти. И он не позволяет создавать секции: вам придётся оперировать каждым битом отдельно. Но у него большая гибкость при создании, имеется несколько перегруженных версий конструктора под разные нужды.

Print Friendly, PDF & Email

WPF: элементы ListBox в виде CheckBox

Print Friendly, PDF & Email

Как в WPF привязать коллекцию типа Boolean к графическому элементу ListBox или ListView с дочерними элементами типа CheckBox?

Напрямую это сделать нельзя. Но можно написать специальный класс-обёртку над коллекцией типа Boolean. Назовём этот класс Wrapper, и пусть он будет обобщённым (generic), чтобы можно было его использовать и с другими простыми типами: