سؤال

هل هناك "سهلة" طريقة لتحديد إما ملف أو مجلد من نفس الحوار ؟

في العديد من التطبيقات لا خلق أسمح لكل الملفات أو المجلدات كما الإدخال.حتى الآن أنا دائما في نهاية المطاف إنشاء مفتاح للتبديل بين الملف أو المجلد اختيار الحوارات أو عصا مع السحب والإفلات وظيفة فقط.

لأن هذا يبدو مثل هذا الشيء الأساسي أتصور هذا وقد تم إنشاؤه من قبل ، ولكن غوغلينغ لا يؤدي إلى الكثير من المعلومات.لذا يبدو أني سوف تحتاج إلى البدء من الصفر و إنشاء مخصص الحوار اختيار, ولكن أنا أفضل عدم إدخال أي المشاكل عن طريق إعادة اختراع العجلة هذه مهمة تافهة.

أي شخص أي نصائح أو القائمة حلول ؟

للحفاظ على واجهة المستخدم ثابت أنه سيكون من الرائع إذا كان من الممكن تمديد OpenFileDialog (أو FolderBrowserDialog).

هل كانت مفيدة؟

المحلول

ومن الناحية الفنية، فمن الممكن. الحوار قذيفة يستخدمها FolderBrowseDialog لديه القدرة على العودة كل الملفات والمجلدات. للأسف، لم يتم كشفها تلك القدرة في .NET. ولا حتى التفكير يمكن أن يظهر العلم الخيار المطلوب.

لجعلها تعمل، وكنت قد لP / استدعاء SHBrowseForFolder () مع العلم BIF_BROWSEINCLUDEFILES تشغيل في BROWSEINFO.ulFlags (القيمة = 0x4000). وP / استدعاء هو شجاع، فمن الأفضل لنسخ ولصق رمز من <لأ href = "http://www.google.com/search؟hl=en&q=shbrowseforfolder+structlayout&btnG=Google+Search&aq=f&oq=" يختلط = "noreferrer"> مصدر آخر أو الطبقة FolderBrowseDialog نفسها بمساعدة العاكس ل.

نصائح أخرى

وبناء على النصائح أعلاه لقد وجدت بعض التعليمات البرمجية تعمل يستخدم الحوار متصفح مجلد القياسية في الموقع التالي: <لأ href = "http://topic.csdn.net/t/20020703/05/845468.html" يختلط = "noreferrer"> http://topic.csdn.net/t/20020703/05/845468.html

ومن الدرجة الاولى للحوار موسع متصفح مجلد

Imports System   
Imports System.Text   
Imports System.Windows.Forms   
Imports System.Runtime.InteropServices   

Public Class DirectoryDialog 
    Public Structure BROWSEINFO 
        Public hWndOwner As IntPtr 
        Public pIDLRoot As Integer 
        Public pszDisplayName As String 
        Public lpszTitle As String 
        Public ulFlags As Integer 
        Public lpfnCallback As Integer 
        Public lParam As Integer 
        Public iImage As Integer 
    End Structure 

    Const MAX_PATH As Integer = 260

    Public Enum BrowseForTypes As Integer 
        Computers = 4096 
        Directories = 1 
        FilesAndDirectories = 16384 
        FileSystemAncestors = 8 
    End Enum 

    Declare Function CoTaskMemFree Lib "ole32" Alias "CoTaskMemFree" (ByVal hMem As IntPtr) As Integer 
    Declare Function lstrcat Lib "kernel32" Alias "lstrcat" (ByVal lpString1 As String, ByVal lpString2 As String) As IntPtr 
    Declare Function SHBrowseForFolder Lib "shell32" Alias "SHBrowseForFolder" (ByRef lpbi As BROWSEINFO) As IntPtr 
    Declare Function SHGetPathFromIDList Lib "shell32" Alias "SHGetPathFromIDList" (ByVal pidList As IntPtr, ByVal lpBuffer As StringBuilder) As Integer 
    Protected Function RunDialog(ByVal hWndOwner As IntPtr) As Boolean 

        Dim udtBI As BROWSEINFO = New BROWSEINFO() 
        Dim lpIDList As IntPtr 
        Dim hTitle As GCHandle = GCHandle.Alloc(Title, GCHandleType.Pinned) 
        udtBI.hWndOwner = hWndOwner 
        udtBI.lpszTitle = Title 
        udtBI.ulFlags = BrowseFor 
        Dim buffer As StringBuilder = New StringBuilder(MAX_PATH) 
        buffer.Length = MAX_PATH 
        udtBI.pszDisplayName = buffer.ToString() 
        lpIDList = SHBrowseForFolder(udtBI) 
        hTitle.Free() 
        If lpIDList.ToInt64() <> 0 Then 
            If BrowseFor = BrowseForTypes.Computers Then 
                m_Selected = udtBI.pszDisplayName.Trim() 
            Else 
                Dim path As StringBuilder = New StringBuilder(MAX_PATH) 
                SHGetPathFromIDList(lpIDList, path) 
                m_Selected = path.ToString() 
            End If 
            CoTaskMemFree(lpIDList) 
        Else 
            Return False 
        End If 
        Return True 
    End Function 

    Public Function ShowDialog() As DialogResult 
        Return ShowDialog(Nothing) 
    End Function 

    Public Function ShowDialog(ByVal owner As IWin32Window) As DialogResult 
        Dim handle As IntPtr 
        If Not owner Is Nothing Then 
            handle = owner.Handle 
        Else 
            handle = IntPtr.Zero 
        End If 
        If RunDialog(handle) Then 
            Return DialogResult.OK 
        Else 
            Return DialogResult.Cancel 
        End If 
    End Function 

    Public Property Title() As String 
        Get 
            Return m_Title 
        End Get 
        Set(ByVal Value As String) 
            If Value Is DBNull.Value Then 
                Throw New ArgumentNullException() 
            End If 
            m_Title = Value 
        End Set 
    End Property

    Public ReadOnly Property Selected() As String 
        Get 
            Return m_Selected 
        End Get 
    End Property 

    Public Property BrowseFor() As BrowseForTypes
        Get 
            Return m_BrowseFor 
        End Get 
        Set(ByVal Value As BrowseForTypes) 
            m_BrowseFor = Value 
        End Set 
    End Property 

    Private m_BrowseFor As BrowseForTypes = BrowseForTypes.Directories 
    Private m_Title As String = "" 
    Private m_Selected As String = "" 

    Public Sub New() 
    End Sub
End Class 

ورمز لتنفيذ الحوار الموسع

Sub Button1Click(ByVal sender As Object, ByVal e As EventArgs)
    Dim frmd As DirectoryDialog = New DirectoryDialog()
    ' frmd.BrowseFor = DirectoryDialog.BrowseForTypes.Directories   
    ' frmd.BrowseFor = DirectoryDialog.BrowseForTypes.Computers   
    frmd.BrowseFor = DirectoryDialog.BrowseForTypes.FilesAndDirectories   
    frmd.Title = "Select a file or a folder"    
    If frmd.ShowDialog(Me) = DialogResult.OK Then   
        MsgBox(frmd.Selected)   
    End If   
End Sub

ويمكنك استخدام OpenFileDialog القياسية لتحديد مجلد. هنا مقالة في CodeProject التي أظهرت طريقة للقيام بذلك ( HTTP: // شبكة الاتصالات العالمية. codeproject.com/KB/dialog/OpenFileOrFolderDialog.aspx ).

وتم القيام به. يمكنك استخدام FolderBrowserDialogEx - ويمكن إعادة استخدامها مشتق من FolderBrowserDialog المضمنة. هذا واحد يسمح لك اكتب في مسار، حتى مسار UNC. يمكنك تصفح المجلدات أو الملفات + المجلدات. يمكنك تصفح لأجهزة الكمبيوتر أو الطابعات معها. وبناء على FBD في البناء، ولكن ... على نحو أفضل. أكثر مرونة. إذا قمت بالنقر فوق مجلد في واجهة المستخدم الرسومية، يظهر المسار في مربع النص. إذا كنت رئيسيا في مسار، ويحصل على activatied المجلد. الكثير من الخيارات يفتقر إلى الحوار المضمنة.

وشفرة المصدر كامل. مجانا. رخصة MS-العام.

ورمز لاستخدامه:

     var dlg1 = new Ionic.Utils.FolderBrowserDialogEx();
     dlg1.Description = "Select a folder to extract to:";
     dlg1.ShowNewFolderButton = true;
     dlg1.ShowEditBox = true;
     //dlg1.NewStyle = false;
     dlg1.SelectedPath = txtExtractDirectory.Text;
     dlg1.ShowFullPathInEditBox = true;
     dlg1.RootFolder = System.Environment.SpecialFolder.MyComputer;

     // Show the FolderBrowserDialog.
     DialogResult result = dlg1.ShowDialog();
     if (result == DialogResult.OK)
     {
         txtExtractDirectory.Text = dlg1.SelectedPath;
     }

AFAIK, لا يوجد شيء في .NET framework أن يفعل هذا في الخروج من مربع.

على .صافي ملف الحوارات تستمد من CommonDialog:

ورثت الفصول المطلوبة تنفيذ RunDialog بالتذرع ShowDialog لخلق مشترك معين في مربع الحوار.ورثت الطبقات يمكن تجاوز HookProc لتنفيذ محددة في مربع الحوار ربط وظائف.

وجميع من بني في الحوارات استخدام ال API قذيفة التي تتوافق مع عملها، PrintDialog، OpenFileDialog، SaveFileDialog، الخ ...

وأنت سوف يكون على الأرجح لبناء هذه الوظيفة يدويا.

http://www.pinvoke.net/default.aspx/shell32.shbrowseforfolder

هنا هو gerat الرابط إذا كنت تغيير في هذه العينة

  bi.ulFlags = BIF_NEWDIALOGSTYLE | BIF_SHAREABLE;

بالنسبة

  bi.ulFlags = BIF_NEWDIALOGSTYLE | BIF_SHAREABLE | BIF_BROWSEINCLUDEFILES;

سوف تحصل على ما تريد

إذا كنت ترغب في عرض أنواع الملفات معينة فقط، ما يلي <لأ href = "http://www.codeproject.com/KB/shell/csdoesshell1.aspx؟fid=14137&df=90&mpp=25&noise=3&sort=Position&view = سريعة والاب = 26 "يختلط =" نوفولو noreferrer "> المقالة (مع شفرة المصدر في C #) يمكن أن تساعدك على:

HTTP : //www.codeproject.com/KB/shell/csdoesshell1.aspx ااا = 14137 & مدافع = 90 & MPP = 25 & الضوضاء = 3 ونوع = الوظيفة وجهة نظر = سريعة والاب = 26

وهذا ما يفسر أيضا الخيارات الأخرى المتوفرة ل "تخصيص" الحوار FolderBrowser،

وهذا سوف يسمح لك لتحديد المجلدات باستخدام OpenFileDialog

        openFileDialog1.CheckFileExists = false;
        openFileDialog1.ValidateNames = false;

على Ookii الحوارات تنفيذ مجلد المتصفح الحوار التي تسمح لكل الملفات أو المجلدات كمدخل ، وهو متاح على نظام ويندوز أشكال WPF.

enter image description here

Ookii.الحوارات.Wpf

https://github.com/caioproiete/ookii-dialogs-wpf


Ookii.الحوارات.WinForms

https://github.com/caioproiete/ookii-dialogs-winforms

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top