Размещение Windows Shell Explorer в моем приложении WPF - PullRequest
8 голосов
/ 02 декабря 2008

Можно ли встроить представление обозревателя файлов / папок Windows Explorer в окно WPF или WinForms?

Я хочу разместить браузер файлов / папок как часть окна моего приложения. Я не хочу повторно реализовывать то, что обеспечивает оболочка, особенно расширения оболочки, такие как TortoiseSVN.

Ответы [ 5 ]

7 голосов
/ 31 декабря 2009

Оболочка Windows Vista представила новый элемент управления, который реализует интерфейс IExplorerBrowser; это рекомендуемый метод размещения представления файловой системы Windows Shell в вашем приложении. Разработчики, создающие приложения с использованием .NET, могут использовать упакованную версию элемента управления ExplorerBrowser, доступную в Windows API CodePack для .NET.

Обратите внимание, что этот интерфейс доступен только в Windows Vista и более поздних версиях. Если ваше приложение должно работать в более ранних версиях Windows, вам нужно будет вернуться к старой реализации WebOC на этих платформах.

http://msdn.microsoft.com/en-us/library/bb761909(VS.85).aspx http://code.msdn.microsoft.com/WindowsAPICodePack

Рекомендуется для размещения элемента управления веб-браузера из-за проблемы Win7, описанной здесь: http://blogs.msdn.com/ieinternals/archive/2009/12/30/Windows-7-Web-Browser-Control-will-not-browse-file-system.aspx

7 голосов
/ 03 декабря 2008

Насколько я знаю, в Windows Forms и WPF нет встроенного элемента управления обозревателем файлов / папок.
Однако существуют коммерческие сторонние элементы управления, которые предлагают Windows-подобный интерфейс для просмотра файлов и папок на диске. Посмотрите на эти продукты от LogicNP:

Кроме того, вы можете разместить элемент управления Windows Forms WebBrowser в WPF и использовать его для просмотра файловой системы, поскольку он интегрирован с оболочкой Windows.
В XAML вы можете сделать что-то вроде этого:

<Window x:Class="Samples.FilesystemBrowser"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:wf="clr-namespace:System.Windows.Forms;assembly=System.Windows.Forms"
    Title="Filesystem Browser">
    <StackPanel>
        <WindowsFormsHost>
            <wf:WebBrowser Url="C:\" />
        </WindowsFormsHost>
    </StackPanel>
</Window>

Обратите внимание, что с .NET 3.5 SP1 Microsoft добавила собственный элемент управления WPF WebBrowser , поэтому вы можете дополнительно использовать его вместо:

<Window x:Class="Samples.FilesystemBrowser"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="Filesystem Browser">
    <StackPanel>
        <WebBrowser Source="C:\" />
    </StackPanel>
</Window>
2 голосов
/ 03 декабря 2008

Я написал библиотеку с открытым исходным кодом для встраивания проводника Windows в приложения .NET. Вы можете взглянуть на http://gong -shell.sourceforge.net /

Он предоставляет элементы управления WinForms, а также предоставляет языковой интерфейс .NET для оболочки Windows. Он лицензирован по лицензии GPL, поэтому его использование в аналогично лицензированном приложении бесплатное, однако, если вы хотите использовать его в коммерческом приложении, напишите мне письмо, и я уверен, что мы сможем что-нибудь с этим поделать!

1 голос
/ 03 декабря 2008

Подход в моем ответе не тот, который я бы порекомендовал, так как это в основном огромный взлом. Тем не менее, можно «разместить» практически любое приложение Windows внутри другого. Предостережения:

  • Это большой толстый хак
  • Я совсем не уверен, насколько хорошо он работает с различными функциями безопасности, например, в Vista
  • Вы будете все время работать с низкоуровневыми и иногда недокументированными API-интерфейсами и делать вещи, которые не соответствуют ожиданиям оригинальных дизайнеров.
  • Я недостаточно хорошо знаю различные API, чтобы точно сказать вам, что делать, так что это очень грубый набросок ...

Основной подход заключается в следующем:

  1. Запустить новый процесс explorer.exe
  2. Получи свой HWnd
  3. Используя вызовы p / invoke в различные API-интерфейсы Windows (в основном это shell32.dll), переопределите его в своем собственном NativeWindow или UserControl.
  4. Затем вы можете заменить его обработчик сообщений WndProc своим собственным, разделив его на подклассы, чтобы внедрить свое собственное поведение, специфичное для приложения. ( C ++ пример ; stackoverflow вопрос WRT, вызывающий старый / default WndProc; googling даст много ответов. Я делал это раньше в C # и ( ick) VBA) Это позволит вам заменить различные варианты поведения пользовательского интерфейса своим собственным, очень низким уровнем. (Это зависит от того, как именно реализован проводник: вещи более высокого уровня, такие как щелчки меню, могут получать свое собственное сообщение и, следовательно, их легче обрабатывать; но в других аспектах поведения проводника вы можете получить только необработанные сообщения мыши.)

Вам понадобится Spy ++ , чтобы выяснить, какие сообщения происходят, когда.

Да, это отличный способ создать множество очень уродливого и хрупкого кода, но иногда это (а) единственный способ заставить все работать правильно; и (б) отлично подходит для изучения того, что происходит под капотом Windows. Forms / MFC / etc.

0 голосов
/ 11 мая 2010

Я полагаю, что пакет кода Windows API для .NET, выпущенный в 2009 году, содержит компоненты Windows Forms для этого. Посмотрите на ответы на вопрос: Использовать проводник Windows в коде .NET? .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...