Как заставить свойство настраиваемого элемента управления открывать диалоговое окно файла? - PullRequest
0 голосов
/ 08 мая 2020

У меня есть настраиваемый элемент управления со свойством, содержащим имя (полный путь) к расположению файла, которое существует на целевом компьютере.

Точный путь будет варьироваться в зависимости от типа цели p c и обычно устанавливается сразу после добавления настраиваемого элемента управления в мою форму, пока я все еще нахожусь в режиме разработки своего проекта, так что когда мой приложение запускается, оно берет имя файла из свойства.

Было бы удобно, если бы свойство открывало диалоговое окно с файлом, позволяющее мне перейти к местоположению (аналогично тому, как открываются диалоговые окна при просмотре свойств изображения и цвета), но это не представляется возможным в визуальные основы c.

После нескольких дней поиска в Google я нашел пару статей, которые касаются темы для других языков программирования (см. Примерный фрагмент ниже), но я не смог понять, как заставить его работать для визуальной основы c.

Вот отрывок, который я обнаружил, в котором упоминается использование редактора, который может быть ключом к началу работы.

[Editor(typeof(FileSelectorTypeEditor), typeof(UITypeEditor))]
public string Filename
{
   get { return _filename; }
   set { _filename = value; }
}

Надеюсь, что кто-то там может привести меня к правильный путь.

1 Ответ

0 голосов
/ 08 мая 2020

FileSelectorTypeEditor, вероятно, является настраиваемым классом, производным от FileNameEditor или FolderNameEditor .

Вы можете реализовать и то, и другое, используя стандартный класс, или расширить стандарт по умолчанию своим собственным, как вы видели в тех C# источниках, которые вы нашли.

Здесь я использую специализированный класс FileNameEditor, названный (с некоторым недостатком воображения) SpecializedFileNameEditor и стандартный FolderNameEditor, назначающий UITypeEditor двум свойствам класс.

► Редактор свойств ImagePath - это объект SpecializedFileNameEditor, который использует OpenFileDialog, в котором предварительно выбран фильтр. Он также переопределяет метод EditValue, чтобы установить текущее значение, если оно есть, связанного свойства (здесь ImagePath) в качестве InitialDirectory OpenFileDialog.
ImageFolder Редактор свойств - стандартный FolderNameEditor, который открывает FolderBrowserDialog.

Я также прикрепляю преобразователь типов ExpandableObjectConverter , чтобы вы могли представить два свойства как расширяемый селектор свойств в PropertyGrid.

Здесь вы можете увидеть пример:
Как привязать дочерние элементы управления пользовательского элемента управления к Publi c Свойство

Imports System.ComponentModel
Imports System.Drawing.Design
Imports System.IO
Imports System.Windows.Forms
Imports System.Windows.Forms.Design

<TypeConverter(GetType(ExpandableObjectConverter))>
Public Class ImagePickerClass

    Public Sub New()  
        ' Initialize [...]
    End Sub

    <Editor(GetType(SpecializedFileNameEditor), GetType(UITypeEditor))>
    Public Property ImagePath As String

    <Editor(GetType(FolderNameEditor), GetType(UITypeEditor))>
    Public Property ImageFolder As String

    Public Class SpecializedFileNameEditor
        Inherits FileNameEditor

        Private currentValue As String = String.Empty

        Public Overrides Function EditValue(context As ITypeDescriptorContext, provider As IServiceProvider, value As Object) As Object
            If TypeOf value Is String Then
                currentValue = DirectCast(value, String)
            End If
            Return MyBase.EditValue(context, provider, value)
        End Function

        Protected Overrides Sub InitializeDialog(ofd As OpenFileDialog)
            MyBase.InitializeDialog(ofd)
            If Not currentValue.Equals(String.Empty) Then
                ofd.InitialDirectory = Path.GetDirectoryName(currentValue)
            End If
            ofd.Filter = "PNG Images (*.png)|*.png"
        End Sub
    End Class
End Class
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...