【发布时间】:2011-06-26 19:42:51
【问题描述】:
我是一位经验丰富的程序员,但对 Silverlight 的世界完全陌生。我的任务是解决 Silverlight 应用程序中的问题,并且正在努力寻找我需要的信息。
该应用程序包含一个自定义控件,可以在鼠标光标附近显示弹出工具提示。我需要确保工具提示的位置不会超出控件的范围。理论上很简单,但是我不知道如何获得控件的大小。
它在某些 XAML 中声明,如下所示(出于隐私考虑,主控件名称更改为“XXX”):
<client:XxxHost x:Class="Project.Client.Banana"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:xxx="clr-namespace:Project.Controls;assembly=Project.Controls.Xxx"
xmlns:ui="clr-namespace:Project.Controls.UI;assembly=Project.Controls.UI"
xmlns:client="clr-namespace:Project.Client"
mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="400">
<xxx:XxxControl x:Name="XxxControl">
<xxx:XxxControl.UI>
<ui:Banana DataContext="{Binding}" View="{Binding View}" />
</xxx:XxxControl.UI>
<xxx:XxxControl.TooltipDisplay>
<xxx:MultiTooltipDisplay></xxx:MultiTooltipDisplay>
</xxx:XxxControl.TooltipDisplay>
</xxx:XxxControl>
</client:XxxHost>
在代码中,MultiTooltipDisplay 是一个从 Canvas 派生的类。在其显示工具提示的方法中,它具有以下代码:
public void DisplayTooltips(System.Collections.Generic.List<UIElement> tooltips, Point screenAnchor)
{
ClearTooltips();
if (tooltips.Count > 0)
{
StackPanel ttStack = new StackPanel();
ttStack.Orientation = Orientation.Vertical;
for (int i = 0; i < tooltips.Count; i++)
{
UIElement ttip = tooltips[ i ];
UserControl ttipWrapper = new UserControl();
ttipWrapper.Content = ttip;
ttStack.Children.Add(ttipWrapper);
}
ttStack.SetValue(Canvas.TopProperty, screenAnchor.Y);
ttStack.SetValue(Canvas.LeftProperty, screenAnchor.X + 24.0);
this.Children.Add(ttStack);
}
}
如果我在这个方法的末尾设置一个断点,并检查 ttStack 的Width/Height/ActualWidth/ActualHeight/DesiredSize,我发现它们都是 0 或 NaN。经过一些阅读和反复试验,我发现通过调用 ttStack.UpdateLayout() 可以填充这些值。我不确定这是否是正确的方法,但这些数字似乎是合理的。太好了!
但是,我需要知道显示工具提示的控件的大小,但我遇到了同样的问题。 this.Width/Height/etc 都返回 0 或 NaN。调用 this.UpdateLayout() 不会改变这些属性。
如何确定控件的尺寸?
【问题讨论】:
标签: silverlight canvas controls size