Как создать пользовательский элемент управления, производный от класса CommonDialog

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

Поэтому я подумал, что самым простым решением было бы создать пользовательский элемент управления, производный от CommonDialog (того же класса, что и FolderBrowserDialog), скопировать код из стандартного FolderBrowserDialog и просто немного его изменить, чтобы он также имел "Включить подпапки". "Флажок.

Но когда я скопировал код из папки FolderBrowserDialog по умолчанию, это выдает мне ошибку:

missing partial modifier on declaration of type [my_class_name] another partial declaration of this type exists c#

И это указывает на файл "[my_class_name].Designer.cs".

namespace my_custom_folder_open
{
    // Summary:
    //     Prompts the user to select a folder. This class cannot be inherited.
    [DefaultEvent("HelpRequest")]
    [DefaultProperty("SelectedPath")]
    [Designer("System.Windows.Forms.Design.FolderBrowserDialogDesigner, System.Design, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a")]
    public sealed class UserControl2 : CommonDialog
    {
        // Summary:
        //     Initializes a new instance of the System.Windows.Forms.FolderBrowserDialog
        //     class.
        public UserControl2();

        // Summary:
        //     Gets or sets the descriptive text displayed above the tree view control in
        //     the dialog box.
        //
        // Returns:
        //     The description to display. The default is an empty string ("").
        [Browsable(true)]
        [DefaultValue("")]
        [Localizable(true)]
        public string Description { get; set; }
        //
        // Summary:
        //     Gets or sets the root folder where the browsing starts from.
        //
        // Returns:
        //     One of the System.Environment.SpecialFolder values. The default is Desktop.
        //
        // Exceptions:
        //   System.ComponentModel.InvalidEnumArgumentException:
        //     The value assigned is not one of the System.Environment.SpecialFolder values.
        [Browsable(true)]
        [Localizable(false)]
        public Environment.SpecialFolder RootFolder { get; set; }
        //
        // Summary:
        //     Gets or sets the path selected by the user.
        //
        // Returns:
        //     The path of the folder first selected in the dialog box or the last folder
        //     selected by the user. The default is an empty string ("").
        [Browsable(true)]
        [DefaultValue("")]
        [Localizable(true)]
        public string SelectedPath { get; set; }
        //
        // Summary:
        //     Gets or sets a value indicating whether the New Folder button appears in
        //     the folder browser dialog box.
        //
        // Returns:
        //     true if the New Folder button is shown in the dialog box; otherwise, false.
        //     The default is true.
        [Browsable(true)]
        [DefaultValue(true)]
        [Localizable(false)]
        public bool ShowNewFolderButton { get; set; }

        // Summary:
        //     Occurs when the user clicks the Help button on the dialog box.
        [Browsable(false)]
        [EditorBrowsable(EditorBrowsableState.Never)]
        public event EventHandler HelpRequest;

        // Summary:
        //     Resets properties to their default values.
        public override void Reset();
        protected override bool RunDialog(IntPtr hWndOwner);
    }
}

Где может быть проблема?

Кстати, я создал проект в качестве библиотеки управления Windows Forms..

2 ответа

Вы серьезно на неправильном пути с этим. Эти диалоги являются компонентами, а не элементами управления. Это очень тонкие оболочки для диалогов, встроенных в Windows. Эти диалоги сами ничего не знают о.NET и написаны в неуправляемом коде. Единственная причина, по которой они являются Компонентом, а не просто классом, состоит в том, что вы можете оставить его на форме. Полезно установить несколько свойств с дизайнером.

Возможно, термин "CommonDialog" вводит в заблуждение. Microsoft назвала это "общим" только потому, что они обычно используются в графической программе. И рекомендуется использовать встроенные, чтобы каждая программа имела очень похожий способ, скажем, открыть файл.

Не имеет смысла выводить из CommonDialog, потому что нет необходимости создавать собственный диалог. Потому что в Windows есть только встроенные, и они уже обернуты соответствующими классами.NET. Ваш план разрушит то, что может сделать нативный FolderBrowserDialog. Который не включает показ флажков. Это было запечатано по уважительной причине.

Ганс совершенно прав, что вы не можете решить свою проблему, выведя новый класс из CommonDialog, Что вы можете сделать, это использовать сырье IFileDialog компонент в режиме выбора папки. Вам также нужно будет использовать IFileDialogCustomize добавить свой флажок. Поскольку это всего лишь COM, на самом деле его очень просто использовать из.net.

Другие вопросы по тегам