0

在此处输入图像描述

我有一个 WPF 表单,其中包含不同类型的控件,如文本框、文本块、组合框、按钮等。我需要使用 C# 为每个控件动态添加工具提示,以便它们可以显示以下信息:

  1. X 和 Y 位置
  2. 选项卡索引。

我为每个控件执行如下代码(现在为文本框的代码):

 foreach (Control ctrl in grd.Children)
        {
            if (ctrl.GetType().ToString() == "System.Controls.TextBox")
            {
                tbox = ctrl as TextBox;
                Point p = Mouse.GetPosition(tbox);
                tbox.ToolTip =p.X + " " + p.Y + " \n " + tbox.TabIndex ;
            }
        }

但这不起作用。有什么想法吗?

4

4 回答 4

6

首先,您的类型检查简直是邪恶的。

 if (ctrl.GetType().ToString() == "System.Controls.TextBox")

将其更改为

 if (ctrl is TextBox)

甚至更好

var textbox = ctrl as TextBox;
if(textbox != null)

请注意,在 wpf 中,TextBox 位于System.Windows.Controls命名空间中。

如果您想拥有其他容器、模板任何分组控件,那么您的循环只会检查 Visual Tree 中的第一级,然后您必须遍历树。请参阅this了解如何操作。

于 2012-07-24T10:19:41.163 回答
2
try with this code

var controls = grd.Children.OfType<TextBox>();

foreach(var control in controls)
{
   Point point = Mouse.GetPosition(control);
   control.ToolTip = point.X + " " + point.Y + " \n " + control.TabIndex ;
}
于 2012-07-24T10:19:15.273 回答
0

您的类型检查错误(命名空间!)。尝试这个:

foreach (var ctrl in grd.Children)
        {
            if (ctrl is TextBox)
            {
                tbox = ctrl as TextBox;
                Point p = Mouse.GetPosition(tbox);
                tbox.ToolTip =p.X + " " + p.Y + " \n " + tbox.TabIndex ;
            }
        }
于 2012-07-24T10:23:23.877 回答
0

假设你做 MVVM。

那么你可能有一个 ViewModel 类。在该类中,您可以为每个控件定义一个动态字符串,就在您定义控件的位置。

在 XAML 中,您只需定义工具提示,例如

<Button Content="Submit">
    <Button.ToolTip>
        <ToolTip>
            <StackPanel>
                <TextBlock FontWeight="Bold">Submit Request</TextBlock>
                <TextBlock>Submits the request to the server.</TextBlock>
            </StackPanel>
        </ToolTip>
    </Button.ToolTip>
</Button>

Textblock 文本可以在您的 ViewModel 中传递,Binding 会将它们发送到您的 View。

我想您的 ViewModel 也知道您的控件在哪个选项卡上。

有关工具提示的更多信息,请参阅 WPFTutorials 站点WPF 工具提示控件教程

有关 MVVM 的更多信息,这里有一个快速教程:MSDN on MVVM

于 2012-07-24T10:19:20.913 回答