确定silverlight控件的大小

时间:2011-02-14 09:56:14

标签: silverlight canvas controls size

我是一位经验丰富的程序员,但对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()的调用不会更改这些属性。

如何确定控制的尺寸?

2 个答案:

答案 0 :(得分:1)

在阅读Measure之前尝试在ttStack上调用DesiredSize方法。

答案 1 :(得分:0)

我使用ActualWidthActualHeight,它对我有用。