10

ListViewを含む1つの単純なフォームを使用して新しいWindowsフォームアプリケーション(C#)を作成しました。次に、ViewプロパティをDetailsに変更し、このListViewで使用されるフォントのサイズを大きくしました。結果は次のとおりです。

これは、WindowsClassicをテーマにしたWindowsXPでの外観です。
ここに画像の説明を入力してください

WindowsXPテーマの結果は次のとおりです。
ここに画像の説明を入力してください

Application.EnableVisualStyles()呼び出し を削除するか、 Application.VisualStyleState: を変更することで、アプリケーションの外観がビジュアルスタイルの影響を受けないようにすることができます。ここに画像の説明を入力してください
この変更により、ListViewの外観が希望どおりになりますが、他のコントロールの外観にも影響します。ListViewを、ビジュアルスタイルの影響を受けない唯一のコントロールにしたいと思います。

私はそれに対処しようとする同様の質問も見つけました:
あなたはただ一つのウィンドウズコントロールのために視覚的なスタイル/テーマをオフにすることができますか?
子ではなく、1つのコントロールのみのビジュアルスタイルを無効にするにはどうすればよいですか?

残念ながら、言及された解決策はどれも機能しません。ListViewコントロールの視覚スタイルが無効になっている場合でも、ヘッダー自体が視覚スタイルの影響を受けるいくつかのコントロールで構成されているように見えます。

視覚的なスタイルがListViewヘッダーの外観に影響を与えるのを防ぐC#ソリューションをいただければ幸いです。

4

5 に答える 5

3

これは既知のバグのようで、簡単な回避策はありません。そこの答えによると:

この問題について多くの調査を行った結果、これはWindows OSのバグであり、ComCtl6.0ヘッダーコントロールがフォント情報を図面DCに適用するのを忘れていることがわかりました。

ただし、列ヘッダーを自分で描画することはできます。それを行う方法の詳細については、MSDNのこの記事を参照してください。また、を参照してくださいlistView1_DrawColumnHeader

于 2012-04-13T11:13:28.620 に答える
2

ビジュアルスタイルを無効にするのはどうですか?

このコードを使用すると、1つのコントロールのスタイルを無効にすることができます(ListViewの代わりにListViewConstrolを使用するだけです)。

using System;
using System.Windows.Forms;
using System.Runtime.InteropServices;

public class ListViewControl : ListView {
  [DllImportAttribute("uxtheme.dll")]
  private static extern int SetWindowTheme(IntPtr hWnd, string appname, string idlist);

  protected override void OnHandleCreated(EventArgs e) {
    SetWindowTheme(this.Handle, "", "");
    base.OnHandleCreated(e);
  }
}
于 2012-04-13T11:01:57.790 に答える
2

研究を尽くした後、私はそれを見つけました。事はあなたが電話するとき

SetWindowTheme(this.Handle, "", "");

カスタムListViewクラス内では、視覚的なスタイルがコントロールの外観に影響を与えるのを防ぎますが、の子ウィンドウであるヘッダーコントロール(ウィンドウ)には影響を与えListViewません。したがって、関数を呼び出すときは、ListViewのハンドルではなく、ヘッダーウィンドウのハンドルを指定する必要があります。ListViewSysHeader32ListViewSetWindowTheme

[DllImportAttribute("uxtheme.dll")]
private static extern int SetWindowTheme(IntPtr hWnd, string appname, string idlist);

[DllImport("user32")]
[return: MarshalAs(UnmanagedType.Bool)]
private static extern bool EnumChildWindows(IntPtr window, EnumWindowProc callback, IntPtr i);

// Callback method to be used when enumerating windows:
private static bool EnumWindow(IntPtr handle, IntPtr pointer)
{
    GCHandle gch = GCHandle.FromIntPtr(pointer);
    List<IntPtr> list = gch.Target as List<IntPtr>;
    if (list == null)
        throw new InvalidCastException("GCHandle Target could not be cast as List<IntPtr>");
    list.Add(handle);
    return true;
}

// delegate for the EnumChildWindows method:
private delegate bool EnumWindowProc(IntPtr hWnd, IntPtr parameter);

// get first child:
private static void DisableVisualStylesForFirstChild(IntPtr parent)
{
    List<IntPtr> children = new List<IntPtr>();
    GCHandle listHandle = GCHandle.Alloc(children);
    try
    {
        EnumWindowProc childProc = new EnumWindowProc(EnumWindow);
        EnumChildWindows(parent, childProc, GCHandle.ToIntPtr(listHandle));
        if (children.Count > 0)
            SetWindowTheme(children[0], "", "");
    }
    finally
    {
        if (listHandle.IsAllocated)
            listHandle.Free();
    }
}

protected override void OnHandleCreated(EventArgs e)
{
    DisableVisualStylesForFirstChild(this.Handle);
    base.OnHandleCreated(e);
}
于 2012-04-17T14:02:08.960 に答える
0

Botz3000が彼の回答で述べたように、 WindowsXPでよく知られている問題ListViewです。別の回避策は、ListView.DrawColumnHeaderイベントを登録し、その中のヘッダーフォントをリセットすることです。ListView.OwnerDrawプロパティをに設定する必要がありますtrue。MSDNコードは次のとおりです。

// Draws column headers.
private void listView1_DrawColumnHeader(object sender,
    DrawListViewColumnHeaderEventArgs e)
{
    using (StringFormat sf = new StringFormat())
    {
        // Store the column text alignment, letting it default
        // to Left if it has not been set to Center or Right.
        switch (e.Header.TextAlign)
        {
            case HorizontalAlignment.Center:
                sf.Alignment = StringAlignment.Center;
                break;
            case HorizontalAlignment.Right:
                sf.Alignment = StringAlignment.Far;
                break;
        }

        // Draw the standard header background.
        e.DrawBackground();

        // Draw the header text.
        using (Font headerFont =
                    new Font("Helvetica", 10, FontStyle.Bold))
        {
            e.Graphics.DrawString(e.Header.Text, headerFont,
                Brushes.Black, e.Bounds, sf);
        }
    }
    return;
}

この場合、ヘッダーフォントは常に"Helvetica", 10, FontStyle.Boldリストビューフォントの影響を受けますが、影響を受けません。詳細については、 MSDNを確認してください。

于 2012-04-13T11:58:51.963 に答える
0

ListViewヘッダーを必要な高さにする方法は次のとおりです。

C#-リストビュー列ヘッダーの高さ(Windowsフォーム)

于 2012-04-17T05:39:55.273 に答える