Domanda

Quando un solo clic su un icona di notifica in Vista (come la rete o le icone del suono) si sono presentati con una finestra ancora captionless delimitato ( http://i.msdn.microsoft.com/Aa511448.NotificationArea22 (it-it, MSDN.10) .png ):

http: //i.msdn. microsoft.com/Aa511448.NotificationArea22(en-us,MSDN.10).png

Come posso emulare questi in WPF? La creazione di una nuova finestra e l'impostazione WindowStyle "None" e ResizeMode a "CanResize" produce una stretta risultato tranne che il telaio è un po 'troppo sottile e la finestra è ridimensionabile, che è indesiderabile. Impostazione ResizeMode ai risultati "noresize" in una finestra senza bordo Aero (solo un sottile 2px solida linea di confine.)

È stato utile?

Soluzione 2

ho finalmente capito fuori: se si imposta WindowStyle su "Nessuno" e ResizeMode a "CanResize", allora si otterrà il bordo spesso corretta senza una didascalia, l'unico intoppo è che si può ancora ridimensionare la finestra

Per fortuna questo problema è facilmente risolto gestendo WM_NCHITTEST per il vostro Window esempio:

private IntPtr _hwnd;

protected override void OnSourceInitialized(EventArgs e) {
    _hwnd = new System.Windows.Interop.WindowInteropHelper(this).Handle;
    System.Windows.Interop.HwndSource.FromHwnd(_hwnd).AddHook(_WndProc);
    base.OnSourceInitialized(e);
}

private const int WM_NCHITTEST = 132;
private const int HTCLIENT = 1;

private IntPtr _WndProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled) {
    // We should only receive messages for our own window handle.
    System.Diagnostics.Debug.Assert(hwnd == _hwnd);

    if (msg == WM_NCHITTEST) {
        handled = true;
        return (IntPtr)HTCLIENT;
    }
    return IntPtr.Zero;
}

Per non lasciare che Windows sapere che il cursore si trova su un confine, non saremo mai presentato con un cursore di ridimensionamento.

Altri suggerimenti

Il trucco è quello di aggiungere il confine la vostra auto. Ho fatto in modo da rendere l'elemento di contenuto principale di un DockPanel e l'aggiunta di un bordo. È possibile utilizzare il bordo per personalizzare l'aspetto per abbinare le finestre Vista Style. Io non sono bravo con i colori in modo da non posso nominare quel particolare uno, ma usate Grigio come esempio.

Prova il seguente

<Window x:Class="WpfApplication10.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="Window1" 
    Height="300" 
    Width="300"
    WindowStyle="None"
    ResizeMode="NoResize">
    <DockPanel>
        <Border
            BorderBrush="Gray"
            BorderThickness="5">

            <TextBlock>Here we go</TextBlock>

        </Border>
    </DockPanel>
</Window>

Quello che vi serve è quello di indicare la giusta combinazione di stili di finestra, WPF non espone tutte le opzioni disponibili in Windows, ma è possibile impostare da soli utilizzando PInvoke.

Non sono in una macchina Vista al momento quindi non posso testare combinazione di uno stile di vedere ciò che dà l'aspetto corretto, ma l'elenco degli stili (in C #) è qui http://pinvoke.net/default.aspx/user32/GetWindowLong.html

sei classe Window:

[DllImport("user32.dll")]
static extern int SetWindowLong(IntPtr hWnd, int nIndex, uint dwNewLong);

[DllImport("user32.dll")]
static extern bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int X, int Y, int cx, int cy, uint uFlags);

private const int GWL_STYLE = -16;
private const int GWL_EXSTYLE = -20;
private const UInt32 SWP_NOSIZE = 0x0001;
private const UInt32 SWP_NOMOVE = 0x0002;
private const UInt32 SWP_NOZORDER = 0x0004;
private const UInt32 SWP_NOREDRAW = 0x0008;
private const UInt32 SWP_NOACTIVATE = 0x0010;
private const UInt32 SWP_FRAMECHANGED = 0x0020;

public override void OnSourceInitialized(EventArgs e)
{
    IntPtr hwnd = new System.Windows.Interop.WindowInteropHelper(this).Handle;

    // set styles to a combination of WS_ flags and exstyles to a combination of WS_EX_ flags

    SetWindowLong(hwnd, GWL_STYLE, styles);
    SetWindowLong(hwnd, GWL_EXSTYLE, exstyles);

    // and to activate changes:
    SetWindowPos(hwnd,IntPtr.Zero,0,0,0,0,SWP_NOSIZE|SWP_NOMOVE|SWP_NOZORDER|SWP_NOACTIVATE|SWP_FRAMECHANGED);
}

Ho pensato di postare quello che mi è venuta in mente finora. Questo diventa molto vicino:

<Window.Style>
    <Style TargetType="{x:Type Window}">
        <Setter Property="AllowsTransparency"       Value="True"            />
        <Setter Property="Background"           Value="{x:Null}"        />
        <Setter Property="BorderBrush"          Value="{x:Null}"        />
        <Setter Property="BorderThickness"      Value="0"           />
        <Setter Property="OverridesDefaultStyle"    Value="True"            />
        <Setter Property="ResizeMode"           Value="NoResize"        />
        <Setter Property="SizeToContent"        Value="WidthAndHeight"      />
        <Setter Property="WindowStyle"          Value="None"            />
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type Window}">
                    <Border BorderThickness="1" CornerRadius="4" Background="{x:Null}">
                        <Border.BorderBrush>
                            <SolidColorBrush Color="{x:Static SystemColors.WindowFrameColor}" Opacity="0.75" />
                        </Border.BorderBrush>
                        <Border BorderThickness="5" Background="{x:Null}">
                            <Border.BorderBrush>
                                <SolidColorBrush Color="{x:Static SystemColors.ActiveBorderColor}" Opacity="0.5" />
                            </Border.BorderBrush>
                            <Border BorderThickness="1" Background="White">
                                <Border.BorderBrush>
                                    <SolidColorBrush Color="{x:Static SystemColors.WindowFrameColor}" Opacity="0.75" />
                                </Border.BorderBrush>

                                <ContentPresenter />
                            </Border>
                        </Border>
                    </Border>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
</Window.Style>

È evidente che stanno utilizzando più di un semplice trasparenza sul ActiveWindowBorderColor per disegnare il centro del bordo. Sembra che la parte superiore di 1/4 ha una sovrapposizione bianca mentre la parte inferiore 3/4 ha una sovrapposizione di nero. Anche il bordo esterno ha un colore accento sui bordi destro e inferiore. Se dovessi fare questo per davvero vorrei creare un UserControl che deriva da confine a gestire tutti i piccoli dettagli come questo (e mi permetterà di ridimensionare se voglio) e gettare lo stile della finestra in un dizionario risorse.

C'è una soluzione nel codice postato qui . Ho intenzione di esaminare farlo in XAML dritto, però, ci dovrebbe essere un modo per lo stile vostro bordo della finestra in modo che sembra vicino. Si dovrebbe anche dare un'occhiata a questo per una migliore spiegazione di ciò che il post sul forum sta facendo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top