Winforms控件上的动态工具提示

时间:2014-07-18 19:35:33

标签: winforms binding devexpress tooltip devexpress-windows-ui

我正在寻找最简洁的方法将相同的数据源绑定到控件的工具提示,我将绑定到控件本身。例如,我有一行

control.DataBindings.Add(new Binding("EditValue", dataFeatures, "Key", true));

其中dataFeatures的类型为BindingSource。我在WinForm Form上为许多控件重复了类似的行。其中一些控件可以采用其文本可以跨越文本宽度的值,而不是控件本身可见的值。我希望将每个控件的工具提示绑定到BindingSource的相同属性,而不是重新设计表单的布局以解决在某些情况下某些控件中部分隐藏文本的可能性。控制'EditValueText属性。这可能吗?我可以想象有一种方法可以通过处理EditValueChanged事件来手动完成,就像我已经做的那样,出于不同的原因,但我希望有一个更清晰的解决方案,而不是为每个控件添加新的代码行

有人有建议吗?

谢谢!

2 个答案:

答案 0 :(得分:2)

0。对于 DevExpress 控件,您可以将DevExpressControl.ToolTip属性绑定到相同的值:

devExpressControl.DataBindings.Add(new Binding("EditValue", dataFeatures, "Key", true));
devExpressControl.DataBindings.Add(new Binding("ToolTip", dataFeatures, "Key", true, DataSourceUpdateMode.Never));


1.对于标准的 WinForms 控件,您可以使用System.Windows.Forms.ToolTip组件及其ToolTip.Popup事件。对于每个控件集,其ToolTip为某个值,否则ToolTip将永远不会出现:

control.DataBindings.Add(new Binding("Text", dataFeatures, "Key", true));
toolTip1.SetToolTip(control, "Some value");

现在您可以使用ToolTip.Popup事件:

private bool _updatingToolTip;

private void toolTip1_Popup(object sender, PopupEventArgs e)
{
    if (_updatingToolTip) return;

    //Get binding for Text property.
    var binding = e.AssociatedControl.DataBindings["Text"];

    if (binding == null) return;

    //Get binding value.
    var manager = binding.BindingManagerBase;
    var itemProperty = manager.GetItemProperties().Find(binding.BindingMemberInfo.BindingField, true);

    object value = itemProperty.GetValue(manager.Current);
    string toolTipText;

    if (value == null || string.IsNullOrEmpty(toolTipText = value.ToString()))
    {
        e.Cancel = true;

        return;
    }

    //Update ToolTip text.
    _updatingToolTip = true;
    toolTip1.SetToolTip(e.AssociatedControl, toolTipText);
    _updatingToolTip = false;
}

答案 1 :(得分:0)

您可以使用ToolTipController组件轻松实现动态工具提示。将此组件放在Form上,并通过BaseControl.ToolTipController属性分配给每个编辑器。

完成后,您可以处理ToolTipController.BeforeShow事件并根据控件状态更改文本。活动控件通过事件参数的SelectedControl属性传递。