WPF TextBlock文本仅更新一次

时间:2012-07-12 23:12:13

标签: c# wpf tooltip textblock mouseenter

对不起可能的noob问题,我对C#和WPF很新。

我创建了一个带有一些控件的窗口。所有这些都填写了工具提示。我想在窗口底部有一个专用区域(TextBlock)来显示这些提示而不是工具提示气球。我已经看到了一个类似的解决方案:

public partial class MyWindow : Window
{
    public MyWindow()
    {
        InitializeComponent();

        EventManager.RegisterClassHandler(typeof(FrameworkElement), FrameworkElement.MouseEnterEvent, new MouseEventHandler(MyMouseEventHandler));
    }


    private void MyMouseEventHandler(object sender, MouseEventArgs e)
    {
        // To stop the tooltip from appearing, mark the event as handled
        // But not sure if it is really working
        e.Handled = true;

        FrameworkElement source = e.OriginalSource as FrameworkElement;
        if (null != source && null != source.ToolTip)
        {
            // This really disables displaying the tooltip. It is enough only for the current element...
            source.SetValue(ToolTipService.IsEnabledProperty, false);

            // Instead write the content of the tooltip into a textblock
            textBoxDescription.Text = source.ToolTip.ToString();
        }
    }

文本块没有数据绑定,只是从代码中明确设置文本。

我的问题是,当使用ShowDialog()方法启动对话框时,这在第一次运行时工作正常。但在关闭(或隐藏)并再次显示 textBoxDescription 后不再更新。事件被引发和处理,我可以在调试时看到,控件甚至到了设置 textBoxDescription.Text 的行,只是TextBlock不再更新。我试图用TextBox替换TextBlock,但结果相同。

有没有办法强制TextBlock更新?我为什么需要它?为什么它第一次起作用?

非常感谢提前。

1 个答案:

答案 0 :(得分:0)

尝试在MyWindow类型的静态构造函数中执行RegisterClassHandler,并提供静态方法。

你必须在回调方法中做一些不同的事情(因为它是静态的)才能找到你的textBoxDescription元素.....递归地使用LogicalTree.GetParent直到找到你的Window元素....然后做一个LogicalTree .FindLogicalNode找到你的textBoxDescription命名元素。

http://www.japf.fr/2009/08/wpf-memory-leak-with-eventmanager-registerclasshandler/

public partial class MyWindow : Window
{
    static MyWindow()
    {
        EventManager.RegisterClassHandler(typeof(FrameworkElement), FrameworkElement.MouseEnterEvent, new MouseEventHandler(MyMouseEventHandler));
    }

    public MyWindow()
    {
        InitializeComponent();
    }

    static private void MyMouseEventHandler(object sender, MouseEventArgs e)
    {
        // To stop the tooltip from appearing, mark the event as handled
        // But not sure if it is really working
        e.Handled = true;

        FrameworkElement source = e.OriginalSource as FrameworkElement;
        if (null != source && null != source.ToolTip)
        {
            // This really disables displaying the tooltip. It is enough only for the current element...
            source.SetValue(ToolTipService.IsEnabledProperty, false);

            // Instead write the content of the tooltip into a textblock
            textBoxDescription.Text = source.ToolTip.ToString();
        }
    }