Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / WPF, Silverlight Новый топик    Ответить
 Как элемент, помещаемый в Adorner, расположить в нижнем углу родителя?  [new]
Adorner problem
Guest
Добрый день. Я в своей программе использую AvalonEdit и его SearchPanel - кто пользовался SharpDevelop'ом, думаю, знает как это выглядит. Для отображения SearchPanel внутри AvalonEdit используется custom adorner. Я решил добавить в программу еще одну панель, код сделал по аналогии, благо исходники открыты. Но есть одно но: панель аттачится в верхний левый угол (см. рисунок ниже). Код адорнера для панели выглядит так:
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);
  }
}

и вот так происходит показ панели:
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. Что можно сделать в этом случае?

К сообщению приложен файл. Размер - 4Kb
12 фев 14, 16:12    [15557987]     Ответить | Цитировать Сообщить модератору
 Re: Как элемент, помещаемый в Adorner, расположить в нижнем углу родителя?  [new]
Adorner problem
Guest
Отвечаю сам себе: всё оказалось достаточно просто. Темплейт панели выглядит примерно так:
<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", и всё заработало, как надо:

К сообщению приложен файл. Размер - 3Kb
14 фев 14, 16:03    [15569093]     Ответить | Цитировать Сообщить модератору
Все форумы / WPF, Silverlight Ответить