Как не использовать значок [дубликат]

После использования 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 может вызвать проблемы в других сценариях.

4
задан ygoe 2 September 2013 в 21:49
поделиться

3 ответа

Вышеупомянутое не работает при создании диалогового окна из приложения WPF, имеющего значок. Однако при добавлении следующих двух строк значок правильно исчезает из диалогового окна:

SendMessage(hwnd, WM_SETICON, new IntPtr(1), IntPtr.Zero);
SendMessage(hwnd, WM_SETICON, IntPtr.Zero, IntPtr.Zero);

(sa https://connect.microsoft.com/VisualStudio/feedback/details/745230 / МОФ окна, не может-быть отображены-без Titlebar-значок )

8
ответ дан o-toole-kit 18 August 2018 в 22:33
поделиться
  • 1
    Спасибо, это действительно работает. Кажется, что требуется избежать использования ресурса значка .exe. См. Мой комментарий к другому ответу. – ygoe 4 September 2014 в 12:05
  • 2
    При использовании в проектной системе MPF приведенный выше код удалял значок процесса по умолчанию (VS2013), но оставил на своем месте общий значок – MickyD 3 November 2014 в 06:23
  • 3
    Большое спасибо! У меня была проблема, что значок был удален правильно при запуске приложения с прикрепленным отладчиком, но не при запуске сборки выпуска без отладчика. Ваше решение исправлено! – JanDotNet 22 November 2016 в 12:26

Если вы вы просто помещали слова в свой заголовок в поисковую систему, а не здесь, как я только что сделал, то вы бы нашли гораздо больше результатов, чем эти. Вы можете найти ответ в следующем:

Удаление значка из окна WPF

Можно ли отображать окно wpf без значка в строке заголовка?

Как удалить значок окна WPF

Как удалить значок из окна заголовка

Как скрыть значок окна в WPF

UPDATE >>>

Ничего себе, правда? Я трачу время, чтобы сделать то, что вы должны сделать , и вы меня голодали? Что касается «не читать ваш вопрос» и «ни одна из этих работ» ... на самом деле? Потому что я не только прочитал ваш вопрос, но и проверил, что у каждого сообщения есть действительный ответ. Таким образом, я выполнил первый пример и предположил, что?

enter image description here [/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 свойство, но я предполагаю, что вы этого не сделали, если вы не хотите, чтобы значок появлялся.

21
ответ дан Community 18 August 2018 в 22:33
поделиться
  • 1
    Извините, я видел их всех и ничего не работает. Из вашего ответа я вижу, что вы не читали мой вопрос и особенно не проверяли, что эти предложения действительно работают. – ygoe 3 September 2013 в 07:23
  • 2
    @LonelyPixel, я обновил сообщение для вас с доказательством рабочего примера, который я тестировал ... может быть, вы можете вернуть этот грубый комментарий, который вы оставили, и удалить незаслуженный downvote сейчас? – Sheridan 3 September 2013 в 14:54
  • 3
    Странный. Тогда почему это не работает в моем случае? Возможно, я должен добавить еще одно важное требование: работает за пределами тестовых примеров, в реальных приложениях, в которых есть непустые окна и где существует несколько окон. Если это помогает вообще. – ygoe 3 September 2013 в 19:29
  • 4
    Спасибо @RotsiserMho, я обновлю свой ответ, чтобы это отразить. – Sheridan 19 May 2014 в 08:57
  • 5
    Я нашел разницу: как только мой .exe-файл содержит ресурс значка, значок будет использоваться в окне. Если я оставлю параметр проекта «значком по умолчанию», и не добавляйте другие неуправляемые значки в мой .exe-файл, тогда он работает. Но как только появляется один значок, он отображается. – ygoe 4 September 2014 в 12:03
  • 6

Это то, что я придумал, увидев различные решения этого вопроса:

    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();
    }
}
0
ответ дан ub3rst4r 18 August 2018 в 22:33
поделиться
Другие вопросы по тегам:

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