对不起可能的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更新?我为什么需要它?为什么它第一次起作用?
非常感谢提前。
答案 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();
}
}