Не может создать полноэкранное всплывающее окно WPF

Используя.NET WPF 4.0 в VS2010 RTM: Я не могу создать полноэкранное всплывающее окно WPF.

Если я создаю всплывающее окно, которое измерено 50% шириной и 100% высотой, все хорошо работает, но если я пытаюсь создать "полноэкранное" всплывающее окно, измеренное к 100% шириной и высоту, это заканчивает тем, что отобразилось в 100% шириной и 75% высотой... нижняя часть является усеченной.

Примечание: Ширина и высота на самом деле выражаются в пикселях в коде, я использую процент для создания ситуации немного более понятной...

Это "чувствует" как существует своего рода предел, препятствующий тому, чтобы область всплывающего окна превысила ~75% общей площади экрана.

ОБНОВЛЕНИЕ: Вот Привет Мировой пример, который показывает проблему.

<Window x:Class="TechnologyVisualizer.PopupTest"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="PopupTest" 
        WindowStyle="None" WindowState="Maximized" Background="DarkGray">
    <Canvas x:Name="MainCanvas" Width="1920" Height="1080">
        <Popup Placement="Center" VerticalAlignment="Center" HorizontalAlignment="Center" Width="1900" Height="1060" Name="popContent">
            <TextBlock Background="Red">Hello World</TextBlock>
        </Popup>
        <Button Canvas.Left="50" Canvas.Top="50" Content="Menu" Height="60" Name="button1" Width="80"
                 FontSize="22" Foreground="White" Background="Black" Click="button1_Click" />
    </Canvas>
</Window>




 using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;

namespace TechnologyVisualizer
{
    /// <summary>
    /// Interaction logic for PopupTest.xaml
    /// </summary>
    public partial class PopupTest : Window
    {
        public PopupTest()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, RoutedEventArgs e)
        {
            popContent.IsOpen = true;
        }

    }
}

При выполнении этого нижняя часть, 25% всплывающего окна отсутствуют при изменении ширины всплывающего окна к 500 затем, это пойдет полная высота

9
задан Scrappydog 13 April 2010 в 21:18
поделиться

2 ответа

Ваше предположение об ограничении размера (75% экрана) верно. Это документировано здесь:

http://msdn.microsoft.com/en-us/library/system.windows.controls.primitives.placementmode%28VS.85%29.aspx

Соответствующее примечание отсутствует в документации по .NET 4. Я думаю, вам нужно использовать другой метод получения полноэкранного режима. Я обычно использую максимизированное, без полей, нереализуемое окно.

10
ответ дан 4 December 2019 в 21:09
поделиться

У меня сейчас нет установки VS2010, чтобы попробовать, но если это окажется ошибкой в ​​WPF (как упоминалось в комментарий), я уверен, что использую P / Invoke и этот образец , опубликованный Раймондом Ченом, должен заставить его работать:

WINDOWPLACEMENT g_wpPrev = { sizeof(g_wpPrev) };

void OnLButtonUp(HWND hwnd, int x, int y, UINT keyFlags)
{
  DWORD dwStyle = GetWindowLong(hwnd, GWL_STYLE);
  if (dwStyle & WS_OVERLAPPEDWINDOW) {
    MONITORINFO mi = { sizeof(mi) };
    if (GetWindowPlacement(hwnd, &g_wpPrev) &&
        GetMonitorInfo(MonitorFromWindow(hwnd,
                       MONITOR_DEFAULTTOPRIMARY), &mi)) {
      SetWindowLong(hwnd, GWL_STYLE,
                    dwStyle & ~WS_OVERLAPPEDWINDOW);
      SetWindowPos(hwnd, HWND_TOP,
                   mi.rcMonitor.left, mi.rcMonitor.top,
                   mi.rcMonitor.right - mi.rcMonitor.left,
                   mi.rcMonitor.bottom - mi.rcMonitor.top,
                   SWP_NOOWNERZORDER | SWP_FRAMECHANGED);
    }
  } else {
    SetWindowLong(hwnd, GWL_STYLE,
                  dwStyle | WS_OVERLAPPEDWINDOW);
    SetWindowPlacement(hwnd, &g_wpPrev);
    SetWindowPos(hwnd, NULL, 0, 0, 0, 0,
                 SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER |
                 SWP_NOOWNERZORDER | SWP_FRAMECHANGED);
  }
}

Извините за то, что сейчас не более полезен, но я думаю, что образец C ++ может легко конвертируется в C # с помощью соответствующих DllImport s. Посетите pinvoke.net для получения дополнительной помощи по преобразованию этого в C #.

0
ответ дан 4 December 2019 в 21:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: