我是一位经验丰富的程序员,但对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()的调用不会更改这些属性。
如何确定控制的尺寸?
答案 0 :(得分:1)
在阅读Measure
之前尝试在ttStack上调用DesiredSize
方法。
答案 1 :(得分:0)
我使用ActualWidth
和ActualHeight
,它对我有用。