Как создать окно WPF без frameworks, которая может быть изменена только с помощью захвата?

Если вы установите ResizeMode="CanResizeWithGrip" в Window WPF, тогда в правом нижнем углу будет отображаться ручка изменения размера, как показано ниже:

Если вы устанавливаете WindowStyle="None" строка заголовка исчезает, но серый скошенный край остается до тех пор, пока вы не установите ResizeMode="NoResize" . К сожалению, с этой комбинацией заданных свойств ручка изменения размера также исчезает.

Я переопределил панель управления ControlTemplate через собственный Style . Я хочу указать границу windows самостоятельно, и мне не нужны пользователи, чтобы иметь возможность изменять размер windows со всех четырех сторон, но мне нужна ручка изменения размера.

Может ли кто-нибудь описать простой способ удовлетворить все эти критерии?

  1. У меня нет границы Window кроме той, которую я указываю себе в ControlTemplate .
  2. У вас есть рабочий размер в правом нижнем углу.
  3. У вас нет строки заголовка.

Если вы устанавливаете свойство AllowsTransparency в Window (даже не устанавливая значения прозрачности), граница исчезает, и вы можете изменять размер только с помощью захвата.

    

Результат выглядит так:

Я пытался создать окно без полей с WindowStyle="None" но когда я его протестировал, кажется, что в верхней части появляется белый бар, после некоторого исследования он выглядит как «Resize border», вот изображение (я заметил желтым):

Соревнование

После некоторых исследований в Интернете и множества сложных решений, отличных от xaml, все решения, которые я нашел, были кодом на C # и множеством строк кода, я нашел косвенное решение здесь: Максимальное пользовательское окно теряет эффект тени

    

Примечание . Необходимо использовать среду .NET 4.5, или если вы используете более старую версию, используйте WPFShell, просто ссылайтесь на оболочку и вместо этого используйте Shell:WindowChrome.WindowChrome .

Я использовал свойство WindowChrome Window, если вы используете это, что белая рамка изменения размера исчезает, но вам нужно определить некоторые свойства для правильной работы.

CaptionHeight: это высота области заголовка (заголовок), которая позволяет использовать привязку Aero, двойное нажатие, как обычная строка заголовка. Установите для этого значение 0 (ноль), чтобы заставить кнопки работать.

ResizeBorderThickness: это толщина на краю windows, где вы можете resize windows. Я ставлю 5, потому что мне нравится это число, и потому что, если вы ставите ноль, его трудно resize windows.

После использования этого короткого кода результатом будет следующее:

Решение

И теперь белая граница исчезла без использования ResizeMode="NoResize" и AllowsTransparency="True" , также она показывает тень в окне.

Позже я объясню, как сделать работу кнопок (я не использовал изображения для кнопок) легко с простым и коротким кодом, Im new, и я думаю, что могу опубликовать в codeproject, потому что здесь я не нашел место для публикации учебника.

Может быть, есть еще одно решение (я знаю, что есть сложные и трудные решения для noobs, таких как я), но это работает для моих личных проектов.

Вот полный код

           

Спасибо!

Хотя принятый ответ очень верный, просто хочу указать, что AllowTransparency имеет некоторые проблемы. Он не позволяет отображать элементы управления дочерним окном, то есть WebBrowser, и обычно это приводит к программному рендерингу, который может иметь отрицательные эффекты.

Тем не менее, есть лучшая работа.

Если вы хотите создать окно без frameworks, которая может быть изменена по размеру и может размещать элемент управления WebBrowser или элемент управления Frame, указывающий на URL-адрес, который вы просто не можете, содержимое указанного элемента управления будет пустым.

Однако я нашел обходное решение; в окне, если вы установите WindowStyle равным None, ResizeMode в NoResize (несите меня, вы все равно сможете resize после завершения), тогда убедитесь, что у вас есть UNCHECKED AllowsTransparency, у вас будет окно статического размера без frameworks и покажет управление браузером.

Теперь вы, вероятно, все еще хотите resize? Хорошо, мы можем с этим с помощью вызова interop:

  [DllImport("user32.dll", CharSet = CharSet.Auto)] private static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam); [DllImportAttribute("user32.dll")] public static extern bool ReleaseCapture(); //Attach this to the MouseDown event of your drag control to move the window in place of the title bar private void WindowDrag(object sender, MouseButtonEventArgs e) // MouseDown { ReleaseCapture(); SendMessage(new WindowInteropHelper(this).Handle, 0xA1, (IntPtr)0x2, (IntPtr)0); } //Attach this to the PreviewMousLeftButtonDown event of the grip control in the lower right corner of the form to resize the window private void WindowResize(object sender, MouseButtonEventArgs e) //PreviewMousLeftButtonDown { HwndSource hwndSource = PresentationSource.FromVisual((Visual)sender) as HwndSource; SendMessage(hwndSource.Handle, 0x112, (IntPtr)61448, IntPtr.Zero); } 

И voila, Окно WPF без frameworks и все еще подвижное и изменяемое без потери совместимости с элементами управления, такими как WebBrowser

Образец здесь:

  
  • Внедрить INotifyPropertyChanged в сгенерированные classы Entity Framework
  • WPF - привязка к индексу предметов изнутри ItemTemplate of ItemsControl?
  • FileSystemWatcher используется для просмотра папки / файла
  • Файл метаданных '.dll' не найден.
  • Динамический шаблон изменения данных
  • c # - подход для сохранения пользовательских настроек в приложении WPF?
  • Горизонтальная прокрутка для панели стека не работает
  • Какие приложения WPF реального мира существуют?
  • Цвет переднего плана Progressbar
  • WPF ListView отключает выбор
  • Какова фактическая задача CanExecuteChanged и CommandManager.RequerySposed?
  • Давайте будем гением компьютера.