Чтобы сделать в WPF в панели меню какие-то пункты с выравниваеним по правому краю (например, меню «Справка» или «О программе»), можно описать в XAML произвольную панель элементов, как в примере ниже:
Чтобы создать окно без рамок и без стандартных элементов управления, в файле разметки в свойствах окна достаточно добавить 3 атрибута: WindowStyle, AllowsTransparency и Background.
Для удобства пользователя желательно добавить возможность закрыть окно, а также перетаскивать его по рабочему столу:
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 нужно сделать следующее:
Dim itm As MenuItem = CType(sender, MenuItem)
Dim ctxMnu As ContextMenu = CType(itm.Parent, ContextMenu)
Dim parent As UIElement = ctxMnu.PlacementTarget
Допустим, что мы задали в XAML для текстового элемента TextBlock привязку и хотим узнать её в застраничном коде. Это делается так:
Dim be As BindingExpression = myTextBlock.GetBindingExpression(TextBlock.TextProperty)
Dim bnd As Binding = be.ParentBinding
Dim bindingPath As String = bnd.Path.Path
В .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 можно добавить методы для удаления, вставки или перемещения набора элементов коллекции.