2011-04-12 58 views
7

dışında çalışırken bir WPF penceresinden simgesinin kaldırılması Simgeyi bir uygulamanın penceresinden kaldırmak için (ekli özellik yanıtını kullanarak) kodu Removing Icon from a WPF window'da kullandım ve bu işlem, çalışırken Visual Studio 2010 aracılığıyla çalıştırın. Uygulama normal olarak çalıştırıldığında, simge hala görünür.Visual Studio

Pencerenin Icon özelliğine atanmış bir simgesi bulunmuyor, ancak uygulamada, pencere simgesi olarak gösterilen özellik olan (Uygulama> Kaynaklar> Simge) bir simge var.

Bu farkı davranışta nasıl çözebilirim, böylece uygulama Visual Studio 2010'un dışında çalıştığında simgenin gösterilmiyor mu?

+0

Simgeyi kaldırmak için küçük bir WPF uygulamasının MainWindow'unda başvurulan yanıttaki kodu kullandım. Visual Studio'da ve projemin Bin \ Debug klasöründen çalıştırıldığında çalışır. Bunu etkileyebilecek başka küçük detaylar var mı? –

cevap

2

Biraz kazımak yaptım; Sorununuzu ele alan bir StackOverflow question var. İronik olarak, bu düzeltme yalnızca Visual Studio'nun dışında çalışır. (Zach Johnson tarafından) Yanıtla

İlgili Parçaları:

Bu WPF pencerenin yerel Win32 penceresi kendisiyle ilişkilendirilmiş bir simge sahip olmadığında WS_EX_DLGMODALFRAME simgenin yalnızca kaldırır anlaşılmaktadır. WPF (uygun şekilde), uygulamanın simgesini açıkça belirlenmiş bir simge olmaksızın tüm pencereler için varsayılan simge olarak kullanır. Normalde, bu herhangi bir soruna neden olmaz ve her bir pencerede uygulamanın simgesini manuel olarak ayarlama zorluğunu azaltır; Ancak, simgeyi kaldırmaya çalıştığımızda bu bizim için bir soruna neden olur.

Sorun, WPF'nin bizim için pencere simgesini otomatik olarak ayarlaması olduğundan, WS_EX_DLGMODALFRAME uygularken simgeyi sıfırlamak için Win32 penceresine WM_SETICON gönderebiliriz.

IntPtr hWnd = new WindowInteropHelper(window).Handle; 
int currentStyle = NativeMethods.GetWindowLongPtr(hWnd, GWL_EXSTYLE); 

SetWindowLongPtr(
    hWnd, 
    GWL_EXSTYLE, 
    currentStyle | WS_EX_DLGMODALFRAME); 

// reset the icon, both calls important 
SendMessage(hWnd, WM_SETICON, (IntPtr)ICON_SMALL, IntPtr.Zero); 
SendMessage(hWnd, WM_SETICON, (IntPtr)ICON_BIG, IntPtr.Zero); 

SetWindowPos(hWnd, IntPtr.Zero, 0, 0, 0, 0, 
    SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | SWP_FRAMECHANGED); 

Bu uygulama, Visual Studio dışında çalıştırmak olduğunda çalışır:

const int WM_SETICON = 0x0080; 
const int ICON_SMALL = 0; 
const int ICON_BIG = 1; 

[DllImport("User32.dll", CharSet = CharSet.Auto, SetLastError = true)] 
static extern IntPtr SendMessage(
    IntPtr hWnd, 
    int msg, 
    IntPtr wParam, 
    IntPtr lParam); 

Kod simgesini kaldırın.

+0

GetWindowLongPtr ve SetWIndowLongPtr, GetWindowLongPtr ve SetWIndowLongPtr yerine "GetWindowLong" ve "SetWindowLong" (ORing bir IntPtr ve int, "currentStyle | WS_EX_DLGMODALFRAME" ** ile bittiğinde değiştirilmediğini varsayar. ** Maalesef bu kod benim için çalışmaz. cevabını vermeden önce test edersiniz? (Ayrıca, olduğu gibi derlemez, ya bu kodda ya da başvurulan cevapta "NativeMethods.GetWindowLongPtr" için kod yoktur) – Rob

0

Kabuk tümleştirme kitaplığı sizin için bir seçenek olabilir mi? İstemci olmayan alanı özelleştirmek için bu WindowChrome sınıfını içerir, böylece simgeyi dışarıda bırakabilirsiniz.

0

Belki bu yalnızca (küçültme, geri yükleme ve kapatma) gibi bir pencerenin simgesi değil, Hide the Window Buttons için size yardımcı olacaktır.