WPF Custom Popup

1

У меня есть уникальная проблема с всплывающими окнами WPF.

В моем проекте мне нужно получить растровое изображение полноэкранного приложения WPF и отправить его. Для этого я использую RenderTargetBitmap на моем основном холсте. Все хорошо, пока я не начал использовать Menu & Combobox. Оба они используют Popup для отображения элементов подменю. Поэтому из того, что я читал, Popups реализованы как отдельное Окно, и это не является дочерним элементом MainWindow. Таким образом, растровое изображение рендеринга не получит растровое изображение.

Поэтому я решил реализовать пользовательское всплывающее окно и изменить контрольную таблицу для MenuItem.

В моем пользовательском всплывающем окне событие IsOpenChanged я делаю это

        private void PopupPanel_IsOpenChanged(object sender, DependencyPropertyChangedEventArgs e)
        {
            if ((bool)e.NewValue)
            {
                ContentControl childControl = new ContentControl();
                childControl.Content = this.Content;

                Canvas rootCanvas = FindAncester<Canvas>(this);
                rootCanvas.Children.Add(childControl);

                childControl.Focus();

                Child = childControl;
            }
            else
            {
                if (Child != null)
                {
                    Canvas rootCanvas = FindAncester<Canvas>(this);
                    rootCanvas.Children.Remove(Child);

                    Child = null;
                 }
            }
        }

Идея состоит в том, чтобы отображать дочерний ContentControl поверх моего основного холста в качестве всплывающего окна. Когда я прохожу через все, все идет хорошо, за исключением того, что я ничего не вижу на экране. Любая помощь будет оценена по достоинству.

Теги:
wpf
popup
contentcontrol

1 ответ

2

Ваша проблема далеко не уникальна... тот факт, что Popup ToolTip и Popup не отображаются в скриншотах, хорошо документирован. Общее решение, как вы полагаете, просто создает притворный контроль Popup. Теперь я не могу сказать вам, что не так с вашим примером, но я могу просто предоставить вам какой-нибудь XAML, который будет отображать притворный элемент управления Popup. Попробуй это:

<Grid>
    <!-- Declare normal view content here -->
    <Border CornerRadius="5" Background="White" BorderBrush="LightGray" 
        BorderThickness="1" Width="200" Height="100" Panel.ZIndex="10">
        <Border.Effect>
            <DropShadowEffect BlurRadius="10" Direction="270" ShadowDepth="7" 
                Opacity="0.5" />
        </Border.Effect>
        <TextBlock Text="I'm a fake Popup control" HorizontalAlignment="Center" 
            VerticalAlignment="Center" />
    </Border>
</Grid>

Изображение 174551

Чтобы сделать это более полезным, я бы добавил свойство Binding для TextBlock.Text а другое для свойства Visibility, чтобы вы также могли контролировать, когда оно появляется и исчезает.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню