سؤال

عندما واحد عن طريق النقر على رمز الإعلام في ويندوز فيستا (مثل الشبكة أو الصوت الرموز) يتم تقديمك مع تحدها بعد captionless الحوار (http://i.msdn.microsoft.com/Aa511448.NotificationArea22(en-us MSDN.10).png):

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

كيف يمكنني أن تحاكي هذه في WPF?إنشاء نافذة جديدة ووضع WindowStyle إلى "لا شيء" و ResizeMode إلى "CanResize" تنتج وثيقة النتيجة إلا أن الإطار هو قليلا رقيقة جدا و الحوار هو يمكن تغيير حجم, وهو غير مرغوب فيه.إعداد ResizeMode إلى "NoResize" النتائج في نافذة مع أي ايرو الحدود (فقط رقيقة 2px الصلبة خط الحدود.)

هل كانت مفيدة؟

المحلول 2

لقد برزت أخيرا من ذلك:إذا قمت بتعيين WindowStyle إلى "لا شيء" و ResizeMode إلى "CanResize" ثم ستحصل على الصحيح سميكة الحدود دون شرح, فقط عقبة هو الذي لا يزال يمكنك تغيير حجم النافذة.

لحسن الحظ هذه المشكلة بسهولة تصحيحه من خلال التعامل مع WM_NCHITTEST الخاص بك Window على سبيل المثال:

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;
}

عن طريق عدم السماح ويندوز أعلم أن المؤشر على الحدود ، لن يكون عرض مع مؤشر تغيير الحجم.

نصائح أخرى

وهو خدعة لإضافة الحدود نفسك. فعلت ذلك عن طريق جعل عنصر المحتوى الرئيسي لDockPanel وإضافة الحدود. يمكنك استخدام الحدود لتخصيص مظهر لتتناسب مع ويندوز فيستا نمط. أنا لست جيدة مع الألوان لذلك لا أستطيع أن اسم واحد بعينه ولكنها تستخدم رمادي كمثال على ذلك.

وحاول القيام بما يلي

<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>

ما عليك هو تحديد الحق في الجمع بين أنماط الإطار، WPF لا يعرض جميع الخيارات المتاحة في ويندوز ولكن يمكنك ان تحدد بنفسك باستخدام pinvoke.

وأنا لست في آلة ويندوز فيستا الآن لذلك لا يمكنني اختبار مزيج أسلوب لمعرفة ما يعطي نظرة صحيحة ولكن قائمة الأنماط (في C #) هنا <لأ href = "HTTP: // pinvoke. صافي / default.aspx / USER32 / GetWindowLong.html "يختلط =" نوفولو noreferrer "> http://pinvoke.net/default.aspx/user32/GetWindowLong.html

وفيكم كنت الطبقة النافذة:

[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);
}

وكنت احسب أن الرد على ما جئت حتى مع حتى الآن. هذا يقترب جميلة:

<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>

ومن الواضح أنهم يستخدمون أكثر من مجرد الشفافية على ActiveWindowBorderColor رسم منتصف الحدود. ويبدو أن 1/4 رأس ديه تراكب الأبيض حين أن الجزء السفلي 3/4 لديه غطاء أسود. أيضا الحدود الخارجي لديه لون التركيز على الحق والحواف السفلية. إذا كان لي أن تفعل هذا لريال مدريد وأود أن خلق على UserControl مشتقة من الحدود على التعامل مع جميع التفاصيل الصغيرة من هذا القبيل (واسمحوا لي أن تغيير إذا أريد) ورمي أسلوب النافذة في القاموس الموارد.

وهناك حل في التعليمات البرمجية نشر <لأ href = "http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/978223f6-fb7c-410e-ad5a-bfb5dd1c5735/" يختلط = "نوفولو noreferrer"> هنا . انا ذاهب للنظر في فعل ذلك في XAML على التوالي رغم ذلك، يجب أن تكون هناك وسيلة لأسلوب الحدود نافذة بحيث يبدو وثيق. يجب عليك أيضا أن نلقي نظرة على الموقع هذا للحصول على أفضل تفسير ما يقوم به منصب المنتدى.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top