尽管调用了提供者,ToolTipService 仍使用缓存的值
ToolTipService using cached values despite calling provider
我有一个带有 UI 元素的 UWP 应用程序,我为此调用了 ToolTipService.SetToolTip
并传入了一个对象,该对象调用回调以确定 .ToString()
的结果作为值:
ToolTipService.SetToolTip(Status, new DynamicString(() =>
{
var remaining = time - DateTimeOffset.UtcNow;
var tooltipText = remaining.Humanize(precision: 5, minUnit: remaining.Hours > 1 ? TimeUnit.Minute : TimeUnit.Second);
return tooltipText;
}));
每次我将鼠标悬停在相关元素上时,都会调用此回调并计算并返回一个新的工具提示文本值。尽管如此,UI 始终显示旧值:
如果结果总是被缓存我能理解,但如果是这样的话,为什么我在传递的对象上的 .ToString()
方法首先每次都被调用?无论如何都要计算结果,显然也应该使用它。
我想在回调中我可以删除工具提示,然后用新值重新创建它,但这似乎是一种相当迂回的方法。
虽然,为了我自己的理智,我仍然更喜欢一种解决方案,它可以防止将传递对象的 .ToString()
调用缓存到 ToolTipService.SetToolTip(xxx, value)
,这就是我现在使用的:
var tooltip = new ToolTip();
var tooltipText = new TextBlock();
tooltip.Content = tooltipText;
tooltip.Opened += (s, e) =>
{
var remaining = time - DateTimeOffset.UtcNow;
tooltipText.Text = remaining.Humanize(precision: 5, minUnit: remaining.Hours >= 1 ? TimeUnit.Minute : TimeUnit.Second);
};
ToolTipService.SetToolTip(Status, tooltip);
我有一个带有 UI 元素的 UWP 应用程序,我为此调用了 ToolTipService.SetToolTip
并传入了一个对象,该对象调用回调以确定 .ToString()
的结果作为值:
ToolTipService.SetToolTip(Status, new DynamicString(() =>
{
var remaining = time - DateTimeOffset.UtcNow;
var tooltipText = remaining.Humanize(precision: 5, minUnit: remaining.Hours > 1 ? TimeUnit.Minute : TimeUnit.Second);
return tooltipText;
}));
每次我将鼠标悬停在相关元素上时,都会调用此回调并计算并返回一个新的工具提示文本值。尽管如此,UI 始终显示旧值:
如果结果总是被缓存我能理解,但如果是这样的话,为什么我在传递的对象上的 .ToString()
方法首先每次都被调用?无论如何都要计算结果,显然也应该使用它。
我想在回调中我可以删除工具提示,然后用新值重新创建它,但这似乎是一种相当迂回的方法。
虽然,为了我自己的理智,我仍然更喜欢一种解决方案,它可以防止将传递对象的 .ToString()
调用缓存到 ToolTipService.SetToolTip(xxx, value)
,这就是我现在使用的:
var tooltip = new ToolTip();
var tooltipText = new TextBlock();
tooltip.Content = tooltipText;
tooltip.Opened += (s, e) =>
{
var remaining = time - DateTimeOffset.UtcNow;
tooltipText.Text = remaining.Humanize(precision: 5, minUnit: remaining.Hours >= 1 ? TimeUnit.Minute : TimeUnit.Second);
};
ToolTipService.SetToolTip(Status, tooltip);