Как отобразить кнопку X в окне WPF
Я использую следующий механизм, который запрещает агентам закрывать окно после начала обработки транзакции. Как мне их вернуть?
Я связал, не возвращая побитовое НЕ, удалив ~
перед WS_SYSMENU
на SetWindowLong(hwnd, GWL_STYLE, GetWindowLong(hwnd, GWL_STYLE) & WS_SYSMENU);
но это не летало.
Код, который скрывает кнопки, выглядит следующим образом:
public class WithoutCloseButton : Window
{
private const int GWL_STYLE = -16;
private const int WS_SYSMENU = 0x80000;
[DllImport("user32.dll", SetLastError = true)]
private static extern int GetWindowLong(IntPtr hWnd, int nIndex);
[DllImport("user32.dll")]
private static extern int SetWindowLong(IntPtr hWnd, int nIndex, int dwNewLong);
public void HideButtons()
{
var hwnd = new WindowInteropHelper(this).Handle;
SetWindowLong(hwnd, GWL_STYLE, GetWindowLong(hwnd, GWL_STYLE) & ~WS_SYSMENU);
}
public void ShowButtons()
{
var hwnd = new WindowInteropHelper(this).Handle;
SetWindowLong(hwnd, GWL_STYLE, GetWindowLong(hwnd, GWL_STYLE) & WS_SYSMENU);
}
}
private void OpenBrowser(PaymentViewModel viewModel, Uri uri)
{
viewModel.BrowserWindow = new WithoutCloseButton();
viewModel.BrowserWindow.Closed += BrowserWindow_Closed;
var browser = new MyWebBrowser();
var scrollviewer = new ScrollViewer();
var stackPanel = new StackPanel { Orientation = System.Windows.Controls.Orientation.Vertical};
var formsHost = new WindowsFormsHost {Child = browser};
stackPanel.Children.Add(formsHost);
scrollviewer.Content = stackPanel;
viewModel.BrowserWindow.Content = scrollviewer;
viewModel.BrowserWindow.Width = browser.Width = (int)System.Windows.SystemParameters.PrimaryScreenWidth;
viewModel.BrowserWindow.Height = browser.Height = (int)System.Windows.SystemParameters.PrimaryScreenHeight;
viewModel.BrowserWindow.Top = viewModel.BrowserWindow.Left = 0;
viewModel.BrowserWindow.Show();
browser.Show();
browser.Navigate("about:blank");
browser.DocumentCompleted += delegate(object obj, WebBrowserDocumentCompletedEventArgs e)
{
var urlInLower = e.Url.ToString().ToLower();
if (urlInLower == "about:blank")
{
((MyWebBrowser)obj).Navigate(uri);
}
if (urlInLower.Contains("accepted"))
{
ViewModel.AuthCode = this.GetAuthToken();
ViewModel.updateUiWhenDoneWithPayment_RunWorkerCompleted(new object(), null);
ViewModel.BrowserWindow.Close();
ViewModel.BrowserWindow = null;
}
if (urlInLower.Contains("payment/processing"))
{
viewModel.BrowserWindow.HideButtons();
}
if (urlInLower.Contains("payment/error"))
{
viewModel.BrowserWindow.ShowButtons();
}
};
1 ответ
Решение
public void ShowButtons()
{
var hwnd = new WindowInteropHelper(this).Handle;
//SetWindowLong(hwnd, GWL_STYLE, GetWindowLong(hwnd, GWL_STYLE) & WS_SYSMENU);
SetWindowLong(hwnd, GWL_STYLE, GetWindowLong(hwnd, GWL_STYLE) | WS_SYSMENU);
}
&(and)
не добавляет WS_SYSMENU в style
, он возвращает этот флаг, если он установлен на style
,
style | b //sets `b` flag on `style`
style & ~b //clears `b` flag from `style`