(Эффективно) выставить свойства OpenFileDialog для COM Interop - PullRequest
0 голосов
/ 25 октября 2019

Я перепродаю продукт, который использует VBS для улучшения своих форм. Показ OpenFileDialog от VBS больше не является тривиальным с Vista (я не могу вспомнить). Тем не менее, с ним я также опционально поставляю .Net dll, которая использует COM Interop. Поэтому я подумал, что было бы неплохо включить в него FilePicker.

В этой сборке у меня в настоящее время есть следующий (пример) код, который отлично работает:

[ComVisible(true)]
[ProgId("BlaBla.FilePicker")]
[Guid("xxx-xxx-xxx-xxx")]
[ClassInterface(ClassInterfaceType.None)]
[ComDefaultInterface(typeof(IFilePicker))]
public class FilePicker : IFilePicker
{
    public string Show()
    {
        using (OpenFileDialog openFileDialog = new OpenFileDialog())
        {
            if (openFileDialog.ShowDialog() == DialogResult.OK)
            {
                return openFileDialog.FileName;
            }
        }
        return string.Empty;
    }
}

Однако я хотел бы показать (хотя бы некоторые) свойства OpenFileDialog, чтобы я мог устанавливать начальные местоположения, фильтры и т. Д.

Это оказывается на удивление трудным. OpenFileDialog является запечатанным классом, и его базовый класс FileDialog не предназначен для наследования от.

Я мог бы просто выставить опции, жестко их закодировав, фактически имитируя свойства FileDialog.

Но это кажется довольно неэффективным. В идеале я хотел бы просто наследовать некоторый базовый класс или интерфейс и просто реализовать это.

Это возможно?

1 Ответ

0 голосов
/ 25 октября 2019

Почему бы просто не добавить аргументы в IFilePicker.Show, например:

public string Show(string initialDirectory)
{
    using (OpenFileDialog openFileDialog = new OpenFileDialog())
    {
        openFileDialog.InitialDirectory = initialDirectory;
        if (openFileDialog.ShowDialog() == DialogResult.OK)
        {
            return openFileDialog.FileName;
        }
    }
    return string.Empty;
}
...