【问题标题】:Prevent combobox from resizing on font change防止组合框在字体更改时调整大小
【发布时间】:2011-08-16 21:25:55
【问题描述】:

我有一个包含字体系列列表的组合框。你可以猜到我正在制作一个用于在富文本框控件中编辑字体的工具条。问题是当我更改字体时,它会调整我的组合框的大小。

滚动浏览不同的字体会导致组合框变得“跳跃”,并且某些字体的高度很大,这会导致一些搞笑的问题。

展览 A:

图表 B:

是的...我将展示到目前为止的代码...顺便说一下组合框只是绑定到字体系列集合。

    void box_SelectedIndexChanged(object sender, EventArgs e)
    {
        String text = ((Font)box.SelectedItem).Name;
        Font font = (Font)box.SelectedItem;


        BeginInvoke(new Action(() => box.Text = text));
        BeginInvoke(new Action(() => box.Font = font));
    }

任何人都有任何想法,如果我找不到解决方案,我可以停止更改字体并以默认字体显示名称。

【问题讨论】:

    标签: c# winforms combobox


    【解决方案1】:

    我认为使用 ToolStripComboBox 是这里的问题。 .NET 2.0 ToolItem 类具有许多从未得到解决的残余、呃、功能。 WPF 吸走了资源。工具条显然不能很好地处理调整大小。当它变大时,它也不会使表单的其余部分向下移动,这是设计使然。

    规范字体组合框使用所有者绘制以常规样式显示下拉列表中的字体。无需更改框本身的字体。你真的不希望工具条调整大小,这不是一个很棒的 UI。

    【讨论】:

      【解决方案2】:

      我能想到的唯一方法是创建一个自定义组合框控件并从所述控件派生。这将使您能够访问变量 ownerdraw,这为我们提供了更多的灵活性,而不必弄乱 ItemHeight 属性。挂钩其中一个事件,该事件指示控件的值已更改。

      然后您可以使用如下函数来计算新的布局大小:

       using (Font font = new Font(this.Font.FontFamily, (float)this.PreviewFontSize))
        {
          Size textSize;
      
          textSize = TextRenderer.MeasureText("yY", font);
          _itemHeight = textSize.Height + 2;
        }
      

      【讨论】:

        【解决方案3】:

        遗憾的是,我尝试了所有这些方法,但收效甚微。但是,直到今天我查看了 microsoft office 如何实现它时,我才意识到这一点。无论选择什么字体,它们实际上在组合框中为所选项目使用相同的字体。因此,尽管我想让它更加自定义,但我只想对所选索引中显示的任何字体使用统一字体。

        【讨论】:

        • 对,就像汉斯的回答所暗示的那样,他们使用所有者绘图在字体的实际面中绘制字体。它不会通过更改分配给控件的字体来自动完成。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-04-02
        • 2016-07-07
        • 1970-01-01
        • 2015-08-21
        相关资源
        最近更新 更多