Определение размера элемента управления Silverlight - PullRequest
2 голосов
/ 14 февраля 2011

Я опытный программист, но совершенно новый для мира 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);
         }
    }

Если я поставлю точку останова ближе к концу этого метода и проверим Width/Height/ActualWidth/ActualHeight/DesiredSize ttStack, я обнаружу, что все они равны 0 или NaN. После некоторого чтения, проб и ошибок я обнаружил, что при вызове ttStack.UpdateLayout () эти значения будут заполнены. Я не уверен, что это правильный путь, но цифры кажутся разумными. Отлично!

Однако мне нужно знать размер элемента управления, на котором будет отображаться подсказка, но я получаю ту же проблему. this.Width / Height / etc все возвращают 0 или NaN. Вызов this.UpdateLayout () не меняет эти свойства.

Как я могу определить размеры контроллера?

Ответы [ 2 ]

1 голос
/ 14 февраля 2011

Попробуйте вызвать метод Measure для ttStack перед чтением DesiredSize.

0 голосов
/ 15 марта 2011

Я использовал ActualWidth и ActualHeight, у меня это сработало.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...