7

デフォルトでは、C# コンボボックスの項目は左揃えです。DrawItem メソッドをオーバーライドしてコンボボックス drawmode を設定する以外に、この正当化を変更するオプションはありますか? --> DrawMode.OwnerDrawFixed?

乾杯

4

3 に答える 3

4

RightToLeft = RightToLeft.Yes反対側のドロップ ウィジェットも気にしない場合は、コントロール スタイルを に設定できます。

また

イベントを設定DrawMode = OwnerDrawFixed;してフックし、次のようなものDrawItem

    private void comboBox1_DrawItem(object sender, DrawItemEventArgs e)
    {
        if (e.Index == -1)
            return;
        ComboBox combo = ((ComboBox) sender);
        using (SolidBrush brush = new SolidBrush(e.ForeColor))
        {
            e.DrawBackground();
            e.Graphics.DrawString(combo.Items[e.Index].ToString(), e.Font, brush, e.Bounds, new StringFormat(StringFormatFlags.DirectionRightToLeft));
            e.DrawFocusRectangle();
        }
    }
于 2010-06-23T06:26:51.170 に答える
2

WPFでは、これはItemContainerStyleを指定するのと同じくらい簡単です。Windowsフォームでは、少し注意が必要です。カスタム描画がなくても、ComboBoxでRightToLeftプロパティを設定できますが、残念ながら、これはドロップダウンボタンにも影響します。

WindowsフォームはネイティブのComboBoxを使用し、Windowsにはテキストの配置に影響を与えるES_RIGHTのようなComboBoxスタイルがないため、所有者の描画に頼るしか選択肢がないと思います。ComboBoxからクラスを派生させ、TextAlignmentプロパティなどを追加することをお勧めします。次に、TextAlignmentが中央揃えまたは右揃えの場合にのみ、描画を適用します。

于 2010-06-23T06:03:23.200 に答える
1

「DrawMode = System.Windows.Forms.DrawMode.OwnerDrawFixed」と、このような独自の描画メソッドが必要です。

protected virtual void OnDrawItem(object sender, DrawItemEventArgs e)
{
    var comboBox = sender as ComboBox;

    if (comboBox == null)
    {
        return;
    }

    e.DrawBackground();

    if (e.Index >= 0)
    {
        StringFormat sf = new StringFormat();
        sf.LineAlignment = StringAlignment.Center;
        sf.Alignment = StringAlignment.Center;

        Brush brush = new SolidBrush(comboBox.ForeColor);

        if ((e.State & DrawItemState.Selected) == DrawItemState.Selected)
        {
            brush = SystemBrushes.HighlightText;
        }

        e.Graphics.DrawString(comboBox.Items[e.Index].ToString(), comboBox.Font, brush, e.Bounds, sf);
    }
}
于 2015-07-04T05:54:39.213 に答える