【问题标题】:Determining silverlight control's size确定 silverlight 控件的大小
【发布时间】: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


    【解决方案1】:

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

    【讨论】:

    • 嗯,它设置了 ttStack 的 DesiredSize/ActualWidth/ActualHeight,但如果我调用 UpdateLayout(),我已经得到了这些。问题是关于画布(即“this”),以及如何找到它的大小。
    • @Dave:Canvas 只有你给它的大小,或者如果没有分配容器给它的大小。它不会随着内容的扩展而增长。也许您最好从 Grid 派生?
    • 但是如果 Canvas 有一个尺寸,不管它是从哪里得到的,我是否可以不查询它以找出它有多大,或者它的容器有多大?从 Grid 派生可能是另一种选择(如果它支持绝对放置它的孩子 - 我需要阅读它),但目前我只是试图修复应该是一个简单的错误(如果我能正确测量事物!)并在我不太了解 Silverlight 时重新编写代码以使用不同的基类,但这似乎是一项艰巨的任务,尤其是当我不明白这可能对其余部分产生什么影响时应用
    • @Dave:作为测试为您的画布添加背景颜色。你在运行时看到那种颜色吗?我的猜测是否定的。然而画布可以很好地显示其内容。画布的内容不限于赋予它的显示区域。因此,画布可以是零大小,但其内容可以愉快地呈现。我怀疑你正在阅读画布大小,它恰好是 0。
    • 您必须首先: 1. 将控件添加到可视化树中(例如作为某些 ItemsControl 的子级 2. 然后以大尺寸实例作为参数调用控件的 Measure 方法,例如: control.Measure(new Size(double.PositiveInfinity,double.PositiveInfinity)); 之后,您可以检查其 DesiredSize 属性以查看此控件的大小。这样控件将尝试在您给它的大小(无限空间)内拉伸并占用它需要的空间。如果您希望它有大小限制,请在调用 Measure 时使用这些限制。
    【解决方案2】:

    我使用了ActualWidthActualHeight,它对我有用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-08-29
      • 2023-03-22
      • 1970-01-01
      • 1970-01-01
      • 2015-04-18
      • 1970-01-01
      • 2013-04-10
      • 2011-05-05
      相关资源
      最近更新 更多