powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / Как элемент, помещаемый в Adorner, расположить в нижнем углу родителя?
2 сообщений из 2, страница 1 из 1
Как элемент, помещаемый в Adorner, расположить в нижнем углу родителя?
    #38558688
Adorner problem
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день. Я в своей программе использую AvalonEdit и его SearchPanel - кто пользовался SharpDevelop'ом, думаю, знает как это выглядит. Для отображения SearchPanel внутри AvalonEdit используется custom adorner. Я решил добавить в программу еще одну панель, код сделал по аналогии, благо исходники открыты. Но есть одно но: панель аттачится в верхний левый угол (см. рисунок ниже). Код адорнера для панели выглядит так:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
class GoPanelAdorner : Adorner
{
  readonly GoPanel _panel;

  public GoPanelAdorner(UIElement textArea, GoPanel panel)
    : base(textArea)
  {
    _panel = panel;
    AddVisualChild(panel);
  }

  protected override int VisualChildrenCount
  {
    get { return 1; }
  }

  protected override Visual GetVisualChild(int index)
  {
    if (index != 0)
      throw new ArgumentOutOfRangeException();
    return _panel;
  }

  protected override Size ArrangeOverride(Size finalSize)
  {
    _panel.Arrange(new Rect(new Point(0, 0), finalSize));
    return new Size(_panel.ActualWidth, _panel.ActualHeight);
  }
}


и вот так происходит показ панели:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
public void Attach(TextArea textArea)
{
  if (textArea == null)
    throw new ArgumentNullException("textArea");
  _textArea = textArea;
  var layer = AdornerLayer.GetAdornerLayer(textArea);
  _adorner = new GoPanelAdorner(textArea, this);
  if (layer != null)
    layer.Add(_adorner);
}


В резальтате получаем примерно то, что на картинке ниже. Но мне хочется приаттачить панель в правый нижний угол TextArea. Конечно, я мог бы вычислить высоту TextArea, вычесть из него высоту панели, и задать результат как y-координату для Point в ArrangeOverride - но TextArea находится внутри блока, высота которого может изменяться пользователем - панель зависнет на одном месте, а не будет "прилипшей" к нижнему краю TextArea. Что можно сделать в этом случае?
...
Рейтинг: 0 / 0
Как элемент, помещаемый в Adorner, расположить в нижнем углу родителя?
    #38561224
Adorner problem
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Отвечаю сам себе: всё оказалось достаточно просто. Темплейт панели выглядит примерно так:
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
<Style TargetType="{x:Type AttachedUI:GoPanel}">
  <Setter Property="SnapsToDevicePixels" Value="True"/>
  <Setter Property="OverridesDefaultStyle" Value="True"/>
  <Setter Property="Template">
    <Setter.Value>
      <ControlTemplate TargetType="{x:Type AttachedUI:GoPanel}">
        <Border
          HorizontalAlignment="Right"
          VerticalAlignment="Top"
          <Border.Background>
................


Нужно было всего лишь навсего сменть VerticalAlignment="Top" на VerticalAlignment="Bottom", и всё заработало, как надо:
...
Рейтинг: 0 / 0
2 сообщений из 2, страница 1 из 1
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / Как элемент, помещаемый в Adorner, расположить в нижнем углу родителя?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]