После использования WhenAll
вы можете вывести результаты по отдельности с помощью await
:
var catTask = FeedCat();
var houseTask = SellHouse();
var carTask = BuyCar();
await Task.WhenAll(catTask, houseTask, carTask);
var cat = await catTask;
var house = await houseTask;
var car = await carTask;
Вы также можете использовать Task.Result
(поскольку вы знаете, что к этому моменту все они завершены успешно). Однако я рекомендую использовать await
, потому что это явно правильно, в то время как Result
может вызвать проблемы в других сценариях.
Вышеупомянутое не работает при создании диалогового окна из приложения WPF, имеющего значок. Однако при добавлении следующих двух строк значок правильно исчезает из диалогового окна:
SendMessage(hwnd, WM_SETICON, new IntPtr(1), IntPtr.Zero);
SendMessage(hwnd, WM_SETICON, IntPtr.Zero, IntPtr.Zero);
Если вы вы просто помещали слова в свой заголовок в поисковую систему, а не здесь, как я только что сделал, то вы бы нашли гораздо больше результатов, чем эти. Вы можете найти ответ в следующем:
Можно ли отображать окно wpf без значка в строке заголовка?
Как удалить значок из окна заголовка
UPDATE >>>
Ничего себе, правда? Я трачу время, чтобы сделать то, что вы должны сделать , и вы меня голодали? Что касается «не читать ваш вопрос» и «ни одна из этих работ» ... на самом деле? Потому что я не только прочитал ваш вопрос, но и проверил, что у каждого сообщения есть действительный ответ. Таким образом, я выполнил первый пример и предположил, что?
[/g11]
Правильно ... это работает . .. и в .NET 4. Может быть, вы не читали комментарии к ответу, где «последняя строка» добавляется в код? [По-видимому, он не работает в .NET 4.5 на Windows 8 в соответствии с полученным комментарием.]
UPDATE 2 >>>
Ваш последний комментарий о это не работало над крупномасштабными приложениями. Таким образом, я затем добавил код к крупномасштабному приложению, и снова он работал нормально. Тем не менее, я продолжал проверять это, и вы должны использовать RibbonWindow
в вашем приложении, потому что, когда я тестировал этот код на крупномасштабном приложении с RibbonWindow
, код сделал не работа.
Если вы используете обычный Window
, попробуйте этот код (из ответа @ MichalCiechan на первый связанный пост):
Сначала добавьте этот класс:
public static class IconHelper
{
[DllImport("user32.dll")]
static extern int GetWindowLong(IntPtr hwnd, int index);
[DllImport("user32.dll")]
static extern int SetWindowLong(IntPtr hwnd, int index, int newStyle);
[DllImport("user32.dll")]
static extern bool SetWindowPos(IntPtr hwnd, IntPtr hwndInsertAfter, int x,
int y, int width, int height, uint flags);
[DllImport("user32.dll")]
static extern IntPtr SendMessage(IntPtr hwnd, uint msg, IntPtr wParam, IntPtr
lParam);
const int GWL_EXSTYLE = -20;
const int WS_EX_DLGMODALFRAME = 0x0001;
const int SWP_NOSIZE = 0x0001;
const int SWP_NOMOVE = 0x0002;
const int SWP_NOZORDER = 0x0004;
const int SWP_FRAMECHANGED = 0x0020;
const uint WM_SETICON = 0x0080;
public static void RemoveIcon(Window window)
{
// Get this window's handle
IntPtr hwnd = new WindowInteropHelper(window).Handle;
// Change the extended window style to not show a window icon
int extendedStyle = GetWindowLong(hwnd, GWL_EXSTYLE);
SetWindowLong(hwnd, GWL_EXSTYLE, extendedStyle | WS_EX_DLGMODALFRAME);
// Update the window's non-client area to reflect the changes
SetWindowPos(hwnd, IntPtr.Zero, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE |
SWP_NOZORDER | SWP_FRAMECHANGED);
}
}
Затем добавьте это в MainWindow.xaml.cs
:
protected override void OnSourceInitialized(EventArgs e)
{
IconHelper.RemoveIcon(this);
}
Oh ... и еще одно замечание ... это не сработает, если вы установили Window.Icon
свойство, но я предполагаю, что вы этого не сделали, если вы не хотите, чтобы значок появлялся.
Это то, что я придумал, увидев различные решения этого вопроса:
internal const int SWP_NOSIZE = 0x0001;
internal const int SWP_NOMOVE = 0x0002;
internal const int SWP_NOZORDER = 0x0004;
internal const int SWP_FRAMECHANGED = 0x0020;
internal const int GWL_EXSTYLE = -20;
internal const int WS_EX_DLGMODALFRAME = 0x0001;
[DllImport("user32.dll", SetLastError = true)]
internal static extern int GetWindowLong(IntPtr hWnd, int nIndex);
[DllImport("user32.dll")]
internal static extern int SetWindowLong(IntPtr hWnd, int nIndex, int dwNewLong);
[DllImport("user32.dll")]
internal static extern bool SetWindowPos(IntPtr hwnd, IntPtr hwndInsertAfter, int x, int y, int width, int height, uint flags);
/// <summary>
/// Hides icon for window.
/// If this is called before InitializeComponent() then the icon will be completely removed from the title bar
/// If this is called after InitializeComponent() then an empty image is used but there will be empty space between window border and title
/// </summary>
/// <param name="window">Window class</param>
internal static void HideIcon(this Window window)
{
if (window.IsInitialized)
{
window.Icon = BitmapSource.Create(1, 1, 96, 96, PixelFormats.Bgra32, null, new byte[] {0, 0, 0, 0}, 4);
}
else
{
window.SourceInitialized += delegate
{
// Get this window's handle
var hwnd = new WindowInteropHelper(window).Handle;
// Change the extended window style to not show a window icon
int extendedStyle = GetWindowLong(hwnd, GWL_EXSTYLE);
SetWindowLong(hwnd, GWL_EXSTYLE, extendedStyle | WS_EX_DLGMODALFRAME);
// Update the window's non-client area to reflect the changes
SetWindowPos(hwnd, IntPtr.Zero, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | SWP_FRAMECHANGED);
};
}
}
Пример:
public partial class ExampleWindow : Window
{
public ExampleWindow()
{
// Hides icon completely
this.HideIcon();
InitializeComponent();
}
}