3

Win7 の C# 2008 (Net 2.0) に System Windows Forms ListView があります。これには 4 つの列があり、小さなアイコン、fullrowselection がオン、hideselection false、showtooltips true の詳細モードになっています。

3 番目の列は、他の列のように左ではなく、右に配置された唯一の列です。対応するデザイナー プロパティを、論理的な textalignment right に設定しました。しかし、Microsoft はここでほとんど期待を裏切りません。Microsoft Visual Studio も列の見出しを右に揃えますが、これは望ましくありません!!! すべての要素のみが列 3 で右揃えになり、すべての列の見出しテキストはすべて左揃えのままになります。これは、デザイナーの設定ではできないようです。

Googleで長い間検索したところ、これが見つかりました-コードはアイテムを希望どおりに整列させますが、アイテムのテキストが消えて再び表示され、強調表示と選択が部分的に機能しませんListViewが部分的にまたは全体で消え、テキストがレンダリングされます奇妙でシャープでないなどなど - 以下のコードを適用した後、ListView はデフォルトの動作を停止しました。この問題を解決するにはどうすればよいですか (Ownerdraw では、以下のコードが true に設定されています。Fullrowselect、hideselection false、および detailsmode がオンになっています)。基本的に、列 3 のサブ項目のみを、列ヘッダーの textalignment を変更せずに希望どおりに配置する必要があります。他のすべてはデフォルトの描画になります。描画を変更したくありません。配置のみが、説明したカスタムのものになります。その上。

 private void listView1_DrawSubItem(object sender, DrawListViewSubItemEventArgs e)
    {
        TextFormatFlags flags = TextFormatFlags.Left;

        if (e.ColumnIndex == 3)
        {
            flags = TextFormatFlags.Right;
            e.DrawText(flags);
        }
        else
        {
            e.DrawDefault = true;
        }
    }

    private void listView1_DrawColumnHeader(object sender, DrawListViewColumnHeaderEventArgs e)
    {
        e.DrawDefault = true;
    }
4

1 に答える 1

1

すべてのアイテムを自分で描画しながらデフォルトとして描画する代わりに、ColumnHeaderすべてのアイテムをデフォルトとして描画し、ColumnHeader自分で描画してみませんか? このコードを試してみましたがColumnHeader、マウスが上にあるときの のルック アンド フィールは良くありません。 のデフォルトのルックとは異なりColumnHeaderます。同じように見せるには、もっと多くのコードが必要だと確信していますが、そうではありません。使用した色が非常に似ているため、大きく異なります。時間をかけてカスタマイズできます。これは単なるデモです:

public Form1(){
  InitializeComponent();
  listView1.OwnerDraw = true;
  invalidateHeaders = typeof(ListView).GetMethod("InvalidateColumnHeaders",
                                       System.Reflection.BindingFlags.NonPublic |
                                       System.Reflection.BindingFlags.Instance);
} 

bool hot;
System.Reflection.MethodInfo invalidateHeaders;
//DrawColumnHeader event handler
private void listView1_DrawColumnHeader(object sender, DrawListViewColumnHeaderEventArgs e) {
  if (e.Header.TextAlign == HorizontalAlignment.Right) {
      e.DrawBackground();
      e.DrawText(TextFormatFlags.SingleLine | TextFormatFlags.VerticalCenter);
      if (e.Bounds.Contains(listView1.PointToClient(MousePosition))) {
          bool selected = (e.State & ListViewItemStates.Selected) != 0;
          var solidColor = selected ? Color.FromArgb(30, Color.FromArgb(0, 200, 200)) :
                                      Color.FromArgb(30, Color.Aqua);
          var borderColor = selected ? Color.DarkGray : Color.Aqua;
          e.Graphics.FillRectangle(new SolidBrush(solidColor), e.Bounds);
          var rect = e.Bounds;
          rect.Width -= 2;
          rect.Height -= 2;                    
          ControlPaint.DrawBorder(e.Graphics, rect, 
                       Color.FromArgb(40, borderColor), ButtonBorderStyle.Solid);
          hot = true;
       }
       else hot = false;
   } else {
       e.DrawDefault = true;
       if (hot) {
          invalidateHeaders.Invoke(listView1, null);
          hot = false;
       }
   }
}
//DrawItem event handler
private void listView1_DrawItem(object sender, DrawListViewItemEventArgs e) {
   e.DrawDefault = true;
}
//MouseMove event handler
private void listView1_MouseMove(object sender, MouseEventArgs e) {
   invalidateHeaders.Invoke(listView1, null);
}    
于 2013-12-09T03:35:31.873 に答える