Получить форму элемента управления в виде геометрии - PullRequest
2 голосов
/ 25 октября 2011

Есть ли способ получить форму элемента управления и преобразовать его в Geometry объект?

У меня следующая ситуация: в приложении WPF будет показано всплывающее окно. В этом всплывающем окне нет окон, это элемент управления, который станет видимым. Остальная часть приложения станет темнее, так как серый слой находится над приложением.

Теперь проблема в том, что этот серый слой также находится над самим всплывающим окном, что обусловлено дизайном приложения, плюс элемент, по которому щелкнули и открыли всплывающее окно, также не должен быть скрыт слоем. Я решил прикрепить отсеченную геометрию к серому слою, и это нормально, но я должен обнаружить все формы и пути, которые я не хочу скрывать самостоятельно.

Итак, вернемся к моему вопросу: есть ли способ получить форму элемента управления и преобразовать его в Geometry объект? Например. Я нашел способы получить VisualBrush элемента управления, но также не могу преобразовать это - или просто не вижу, как это возможно.

1 Ответ

2 голосов
/ 25 октября 2011

Вы могли бы сделать это следующим образом: удалите кнопку из визуального дерева и поместите ее на украшение.Когда рекламодатель закрывается, прикрепите его к первоначальному родителю снова.Я думаю, что это гораздо более гибко, чем обрезание любых геометрий, и делает его гораздо более гибким (например, вы можете разместить сложный контент, например, пользовательские элементы управления на рекламщике)

В следующем примере панель используется как контейнер для кнопки.

Xaml (окно):

<Grid Margin="50" x:Name="myGrid" Background="LightBlue">
<Button x:Name="myButton" Width="80" Height="30" Click="myButton_Click">Show popup</Button>

Код сзади: частный FrameworkElementAdorner _adorner;приватная панель _originalParent;

private void myButton_Click(object sender, RoutedEventArgs e)
{
  if (_adorner == null)
  {
    _adorner = new FrameworkElementAdorner(myGrid);
  }

  // remove the button from the parent panel and attach it to the adorner
  // otherwise remove from adorner and attach to original parent again
  if (_adorner.IsVisible)
  {
    AdornerLayer adornerLayer = AdornerLayer.GetAdornerLayer(myGrid);
    adornerLayer.Remove(_adorner);

    Panel parent = VisualTreeHelper.GetParent(myButton) as Panel;
    if (parent != null)
    {
      parent.Children.Remove(myButton);
    }
    _originalParent.Children.Add(myButton);
  }
  else
  {
    _originalParent = VisualTreeHelper.GetParent(myButton) as Panel;
    if (_originalParent != null)
    {
      _originalParent.Children.Remove(myButton);
    }

    // Create the Adorner with the original button in it
    _adorner.Child = CreateAdornerContent(myButton);

    AdornerLayer adornerLayer = AdornerLayer.GetAdornerLayer(myGrid);
    adornerLayer.Add(_adorner);
  }
}

/// <summary>
/// Creates some dummy content for the adorner
/// </summary>
private FrameworkElement CreateAdornerContent(Button myButton)
{
  Grid g = new Grid();
  g.Background = new SolidColorBrush(Colors.Yellow);

  TextBlock tb = new TextBlock();
  tb.Text = "I am the Adorner";

  g.Children.Add(tb);
  g.Children.Add(myButton);
  return g;
}

А вот простой рекламщик, который просто отображает frameworkElement: класс FrameworkElementAdorner: Adorner {private FrameworkElement _child;

public FrameworkElementAdorner(UIElement adornedElement)
  : base(adornedElement)
{
}

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

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

public FrameworkElement Child
{
  get
  {
    return _child;
  }
  set
  {
    if (_child != null)
    {
      RemoveVisualChild(_child);
    }
    _child = value;
    if (_child != null)
    {
      AddVisualChild(_child);
    }
  }
}

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

}

IВы также можете загрузить полный SLN, если хотите.Возможно ли это как-то здесь?

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