Я использую SetWindowTheme, и SendMessage для создания .NET listview похожи на стиль перспективы listview, но управление .NET все еще имеет точечную границу выделения вокруг выбранного пункта:
Выбранные пункты в проводнике listview не имеют той границы вокруг них. Как я могу удалить его?
Windows Explorer:
Править: Решение:
public static int MAKELONG(int wLow, int wHigh)
{
int low = (int)LOWORD(wLow);
short high = LOWORD(wHigh);
int product = 0x00010000 * (int)high;
int makeLong = (int)(low | product);
return makeLong;
}
SendMessage(olv.Handle, WM_CHANGEUISTATE, Program.MAKELONG(UIS_SET, UISF_HIDEFOCUS), 0);
Помогает ли установка свойства ListView.ShowFocusCues значения false?
Установка для свойства HotTracking значения true скрывает прямоугольник фокуса. Это воспроизвело стиль проводника на моей машине Win7:
using System;
using System.Windows.Forms;
using System.Runtime.InteropServices;
class MyListView : ListView {
public MyListView() {
this.HotTracking = true;
}
protected override void OnHandleCreated(EventArgs e) {
base.OnHandleCreated(e);
SetWindowTheme(this.Handle, "explorer", null);
}
[DllImport("uxtheme.dll", CharSet = CharSet.Auto)]
public extern static int SetWindowTheme(IntPtr hWnd, string appname, string subidlist);
}
Помните, что подчеркнутые элементы являются побочным эффектом.
Не похоже, что существует особый способ изменить стили ListViewItem с помощью Windows Forms.
Иногда невозможно изменить поведение некоторых элементов управления Win32 с помощью управляемого кода. Единственный способ - выполнить P / Invoke для изменения определенного поведения. Я считаю, что это действительно сложно, но у тебя нет другого выбора. Я часто сталкивался с этой ситуацией при разработке пользовательского интерфейса Windows Mobile (справедливо с помощью ListView).
У меня нет прямого ответа на ваш вопрос, но я почти уверен, что, если это невозможно с помощью Windows Forms, вы, безусловно, можете сделать это с помощью P / Invoke. Единственные подсказки, которые я могу вам дать: