在 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 文档的参考,您可以参考。
结果:
我正在使用 .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 文档的参考,您可以参考。
结果: