在 C# 中查找 CurrentViewMode 的等效项

Find the equivalent of CurrentViewMode in C#

我正在使用 .NET 4.7 浏览 WebBrowser 控件中的本地文件夹:

webBrowser1.Navigate("C:/some_folder");

此文件夹以竖线显示 pdf 以及最后更新、大小和类型。 我只需要找到 属性 即可让我在“马赛克视图”中显示此列表,其中图标更大且没有任何额外信息,例如上次更新、文件大小或类型…… 经过一些挖掘后,我发现一些 vb.net 用户获得了 属性 webBrowser.Document.CurrentViewMode。我确实有 webBrowser.Document 但没有诸如 CurrentViewMode 之类的...我猜这应该是一件愚蠢的事情,因为这相当于右键单击并选择显示的文档列表的属性...)

感谢您的帮助

根据我的研究,我无法在 webbrower.document 中找到直接 属性 调用 CurrentViewMode。

不过,我找到了另一种方法来改变浏览器的视图。

这是您可以参考的代码示例。

 public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        private const int LV_VIEW_ICON = 0x0;

        private const int LV_VIEW_DETAILS = 0x1;

        private const int LV_VIEW_SMALLICON = 0x2;

        private const int LV_VIEW_LIST = 0x3;

        private const int LV_VIEW_TILE = 0x4;

        private const int EM_HIDEBALLOONTIP = 0x1504;

        private const int LVM_SETVIEW = 0x108E;

        private const string ListViewClassName ="SysListView32";
        private static readonly HandleRef NullHandleRef = new HandleRef(null, IntPtr.Zero);

        [DllImport("user32.dll")]
        [return: MarshalAs(UnmanagedType.Bool)]
        private static extern bool EnumChildWindows(HandleRef hwndParent, EnumChildrenCallback lpEnumFunc, HandleRef  lParam);

        [DllImport("user32.dll")]
        private static extern IntPtr SendMessage(IntPtr hWnd, int Msg, IntPtr wParam, IntPtr lParam);

        [DllImport("user32.dll")]
        static extern uint RealGetWindowClass(IntPtr hwnd, [Out] StringBuilder pszType,uint cchType);

        private delegate bool EnumChildrenCallback(IntPtr hwnd, IntPtr lParam);

        private HandleRef listViewHandle;

        private void FindListViewHandle()
        {
            this.listViewHandle = NullHandleRef;

            EnumChildrenCallback lpEnumFunc = new EnumChildrenCallback(EnumChildren);

            EnumChildWindows(new HandleRef(this.webBrowser1, this.webBrowser1.Handle), lpEnumFunc, NullHandleRef);
        }
        private bool EnumChildren(IntPtr hwnd, IntPtr lparam)
        {
            StringBuilder sb = new StringBuilder(100);

            RealGetWindowClass(hwnd, sb, 100);

            if (sb.ToString() == ListViewClassName)
                this.listViewHandle = new HandleRef(null, hwnd);

            return true;
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            webBrowser1.Navigate("D:/pdf");
            comboBox1.Items.Add(LV_VIEW_ICON);
            comboBox1.Items.Add(LV_VIEW_DETAILS);
            comboBox1.Items.Add(LV_VIEW_SMALLICON);
            comboBox1.Items.Add(LV_VIEW_LIST);
            comboBox1.Items.Add(LV_VIEW_TILE);

        }

        private void button1_Click(object sender, EventArgs e)
        {
            FindListViewHandle();

            int view = Convert.ToInt32(comboBox1.SelectedItem);

            SendMessage((IntPtr)this.listViewHandle, LVM_SETVIEW, (IntPtr)view, (IntPtr)0);
        }
    }

更新代码说明:

首先,我们使用FindListViewHandle()在网络浏览器中找到列表视图控件的句柄(listViewHandle),所以我使用EnumChildWindows方法迭代子控件。

其次,我们可以使用combobox1来存储不同的listview样式。

三、消息LVM_SETVIEW表示设置了列表视图控件的视图。

最后,SendMessage方法会在浏览器中找到listviewcontrol,它会设置列表视图控件的视图,并通过组合框的值设置它的样式。

这里有一些来自 Microsoft 文档的参考,您可以参考。

LVM_SETVIEW message

EnumChildWindows

SendMessage

结果: