Используя.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 затем, это пойдет полная высота
Ваше предположение об ограничении размера (75% экрана) верно. Это документировано здесь:
Соответствующее примечание отсутствует в документации по .NET 4. Я думаю, вам нужно использовать другой метод получения полноэкранного режима. Я обычно использую максимизированное, без полей, нереализуемое окно.
У меня сейчас нет установки 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 #.