Рейтинг@Mail.ru

Сортировка ObservableCollection в WPF

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

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

Imports System.Collections.ObjectModel
Imports System.Runtime.CompilerServices

Module ObservableCollectionExtensions

    <Extension>
    Public Sub Sort(Of T)(ByRef collection As ObservableCollection(Of T), comparison As Comparison(Of T))
        Dim sortableList = New List(Of T)(collection)
        sortableList.Sort(comparison)
        For i As Integer = 0 To sortableList.Count - 1
            collection.Move(collection.IndexOf(sortableList(i)), i)
        Next
    End Sub


 <Extension>
    Public Sub Sort(Of T As IComparable)(ByRef collection As ObservableCollection(Of T))
        If (collection.Count > 1) Then
            Dim sortableList As New List(Of T)(collection)
            Dim comp As Comparison(Of T) = Function(a, b) a.CompareTo(b)
            sortableList.Sort(comp)
            For i As Integer = 0 To sortableList.Count - 1
                collection.Move(collection.IndexOf(sortableList(i)), i)
            Next
        End If
    End Sub

End Module

Использование:

    MyCollection.Sort(Function(a, b) a.CompareTo(b))

или просто:

    MyCollection.Sort()
Читать далее...

Изменение стиля сетки таблицы Grid в WPF

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

Чтобы изменить стиль линий сетки в WPF:

    Private Sub ShowGridLines()
        Dim t = Type.GetType("System.Windows.Controls.Grid+GridLinesRenderer," _
                                 & " PresentationFramework, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35")
        Dim glr = Activator.CreateInstance(t)
        glr.GetType().GetField("s_oddDashPen", Reflection.BindingFlags.Static Or Reflection.BindingFlags.NonPublic).SetValue(glr, New Pen(Brushes.Silver, 0.2))
        glr.GetType().GetField("s_evenDashPen", Reflection.BindingFlags.Static Or Reflection.BindingFlags.NonPublic).SetValue(glr, New Pen(Brushes.Silver, 0.2))
        matrixGrid.ShowGridLines = True

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

Обновление свойства в TextBox при нажатии Enter в WPF

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

Чтобы обновить code-behind значение значение свойства, привязанного к текстовому полю, по нажатию клавиши "Ввод" сначала в разметке XAML:

<TextBox Text="{Binding MyData}" KeyUp="UpdatePropertyTrigger" />

А далее в коде пишем обработчик:

Private Sub UpdatePropertyTrigger(sender As Object, e As KeyEventArgs)
    If (e.Key = Key.Enter) Then
        Dim tb As TextBox = CType(sender, TextBox)
        tb.GetBindingExpression(TextBox.TextProperty).UpdateSource()
    End If
End Sub
Читать далее...

Как сделать пункт меню с выравниванием по правому краю (WPF)

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

Чтобы сделать в WPF в панели меню какие-то пункты с выравниваеним по правому краю (например, меню «Справка» или «О программе»), можно описать в XAML произвольную панель элементов, как в примере ниже:

<Menu>

    <Menu.ItemsPanel>
        <ItemsPanelTemplate>
            <DockPanel />
        </ItemsPanelTemplate>
    </Menu.ItemsPanel>

    <MenuItem Header="Item1" />
    <MenuItem Header="Item2" />
    <MenuItem Header="Справка" HorizontalAlignment="Right" />
</Menu>
Читать далее...

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
Читать далее...

Как создать безрамочное окно в WPF

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

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

<Window x:Class="BorderlessWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        mc:Ignorable="d"
        WindowStyle="None"
        AllowsTransparency="True"
        Background="Transparent"
        MouseLeftButtonDown="Window_MouseLeftButtonDown"
        Title="Hello, Soltau.ru"
        Width="200" Height="200">
    <Grid>
        <Rectangle Fill="Yellow" Opacity="0.7" RadiusX="40" RadiusY="40" />
        <Button Width="100" Height="30" Content="Закрыть" Click="Button_Click" />
    </Grid>
</Window>

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

Public Class BorderlessWindow

    Private Sub Button_Click(sender As Object, e As RoutedEventArgs)
        Me.Close()
    End Sub

    Private Sub Window_MouseLeftButtonDown(sender As Object, e As MouseButtonEventArgs)
        Me.DragMove()
    End Sub

End Class

Выглядеть это будет примерно так:

Окно без рамок в WPF
Окно без рамок в WPF
Читать далее...

Красивое диалоговое окно в .NET

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

Чтобы вместо стандартного MessageBox в приложении WPF использовать более современное и «красивое» окно, можно использовать средства самой Windows. Напишем класс-помощник, который будет выводить диалоговое окно, используя системную библиотеку comctl32.dll.

Imports System.Runtime.InteropServices

''' <summary>
''' "Красивое" диалоговое окно.
''' </summary>
Public Module TaskDialogHelper

    <DllImport("comctl32.dll", CharSet:=CharSet.Unicode, PreserveSig:=False)>
    Public Function TaskDialog(hwndParent As IntPtr, hInstance As IntPtr, title As String, mainInstruction As String, content As String, buttons As TaskDialogButtons, icon As TaskDialogIcon) As TaskDialogResult
    End Function

    Public Enum TaskDialogResult As Integer
        Ok = 1
        Cancel = 2
        Retry = 4
        Yes = 6
        No = 7
        Close = 8
    End Enum

    <Flags>
    Public Enum TaskDialogButtons As Integer
        Ok = &H1
        Yes = &H2
        No = &H4
        Cancel = &H8
        Retry = &H10
        Close = &H20
    End Enum

    Public Enum TaskDialogIcon As Integer
        Shield = 65532
        Information 
        [Error] 
        Warning 
    End Enum

End Module

Также в манифесте проекта необходимо раскомментировать следующий участок:

  <dependency>
    <dependentAssembly>
      <assemblyIdentity
          type="win32"
          name="Microsoft.Windows.Common-Controls"
          version="6.0.0.0"
          processorArchitecture="*"
          publicKeyToken="6595b64144ccf1df"
          language="*"
        />
    </dependentAssembly>
  </dependency>

Использовать код можно таким образом:

Dim dr = TaskDialogHelper.TaskDialog(New System.Windows.Interop.WindowInteropHelper(Me).Handle,
    IntPtr.Zero,
    "Лаконичный заголовок окна",
    "Здесь будет основной текст сообщения.",
    "А здесь вспомогательный.",
    TaskDialogHelper.TaskDialogButtons.Yes Or TaskDialogHelper.TaskDialogButtons.No,
    TaskDialogHelper.TaskDialogIcon.Information)

Желательно также при выводе данного окна проверять версию операционной системы: данное окно можно использовать в Windows Vista и более современных (версия больше 6):

If (System.Environment.OSVersion.Version.Major >= 6) Then 
    …
Читать далее...

Изменяемая асинхронно наблюдаемая коллекция 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
Читать далее...
Subscribe to this RSS feed
  1. Arduino это...
  2. Arduino это...
  3. Arduino это...
Отличный способ начать знакомство с электроникой, микроконтроллерами и программированием!
Замечательное средство для создания собственных электронных устройств, которые пригодятся в быту или для развлечения!
Уникальный конструктор, для которого разработаны десятки совместимых датчиков и модулей!
next
prev