Я опытный программист, но совершенно новый для мира 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 () не меняет эти свойства.
Как я могу определить размеры контроллера?