كيفية إنشاء نافذة WPF دون الحدود التي يمكن أن تكون تغيير حجمها عن طريق قبضة فقط ؟

StackOverflow https://stackoverflow.com/questions/611298

سؤال

إذا قمت بتعيين ResizeMode="CanResizeWithGrip" على WPF Window ثم تغيير حجم قبضة يظهر في الزاوية اليمنى السفلى ، على النحو التالي:

إذا قمت بتعيين WindowStyle="None" كذلك يختفي شريط العنوان ولكن رمادي مشطوف حافة يبقى حتى تعيين ResizeMode="NoResize".للأسف مع هذا المزيج من الخصائص تعيين حجم قبضة أيضا يختفي.

لقد تجاوز Window's ControlTemplate طريق مخصص Style.أريد أن تحديد الحدود من النافذة نفسي و لا حاجة للمستخدمين لتكون قادرة على تغيير حجم نافذة من جميع الجوانب الأربعة ، ولكن أنا بحاجة إلى تغيير حجم قبضة.

يمكن للشخص تفاصيل طريقة بسيطة لتلبية جميع هذه المعايير ؟

  1. لا وقد الحدود على Window وبصرف النظر عن واحد أحدد نفسي في ControlTemplate.
  2. هل يكون عامل تغيير حجم قبضة في الزاوية اليمنى السفلى.
  3. لا يكون شريط العنوان.
هل كانت مفيدة؟

المحلول

إذا قمت بتعيين AllowsTransparency مكان الإقامة على Window (حتى دون تحديد أي قيم الشفافية) الحدود يختفي يمكنك فقط عن طريق تغيير حجم قبضة.

<Window
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Width="640" Height="480" 
    WindowStyle="None"
    AllowsTransparency="True"
    ResizeMode="CanResizeWithGrip">

    <!-- Content -->

</Window>

النتيجة تبدو مثل:

نصائح أخرى

كنت أحاول إنشاء نافذة بلا حدود مع WindowStyle="None" لكن عندما اختبرت ذلك ، يبدو أن يظهر شريط أبيض في الأعلى, بعد بعض البحوث يبدو أن "تغيير الحدود" ، وهنا صورة (لاحظ أنا في الأصفر):

The Challenge

بعد بعض البحث على الإنترنت ، والكثير من الصعب عدم xaml الحلول كل الحلول التي وجدت كانت التعليمات البرمجية خلف في C# و الكثير من السطور البرمجية ، وجدت غير مباشرة الحل هنا: أقصى نافذة مخصصة يفقد قطرة تأثير الظل

<WindowChrome.WindowChrome>
    <WindowChrome 
        CaptionHeight="0"
        ResizeBorderThickness="5" />
</WindowChrome.WindowChrome>

ملاحظة :تحتاج إلى استخدام .NET 4.5 إطار ، أو إذا كنت تستخدم نسخة قديمة من استخدام WPFShell فقط إشارة قذيفة واستخدام Shell:WindowChrome.WindowChrome بدلا من ذلك.

لقد استخدمت WindowChrome الملكية من النافذة, إذا كنت تستخدم هذا أن الأبيض "تغيير الحدود" يختفي, ولكن تحتاج إلى تحديد بعض خصائص العمل بشكل صحيح.

CaptionHeight: هذا هو ارتفاع المنطقة التوضيحية (headerbar) يسمح Aero snap, النقر المزدوج السلوك العادي شريط العنوان لا.تعيين هذه القيمة إلى 0 (صفر) إلى جعل أزرار العمل.

ResizeBorderThickness: هذا هو سمك على حافة النافذة حيث يمكنك تغيير حجم النافذة.أنا وضعت إلى 5 لأنني أحب هذا العدد ، لأنه إذا وضعت صفر من الصعب تغيير حجم النافذة.

بعد استخدام هذا الرمز القصير النتيجة هو هذا:

The Solution

و الآن الحدود البيضاء اختفت دون استخدام ResizeMode="NoResize" و AllowsTransparency="True", كما يظهر الظل في النافذة.

في وقت لاحق سوف اشرح كيفية عمل أزرار (لم تستخدم الصور عن أزرار) بسهولة مع بسيطة و رمز قصير, Im جديدة وأعتقد أنني يمكن بعد أن codeproject ، لأنه هنا لم أجد مكان إلى آخر البرنامج التعليمي.

ربما هناك حل آخر (وأنا أعلم أن هناك صعبة حلول ودي مثلي) ولكن هذا يعمل على بلدي المشاريع الشخصية.

هنا هو رمز كاملة

<Window x:Class="MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:local="clr-namespace:Concursos"
    mc:Ignorable="d"
    Title="Concuros" Height="350" Width="525"
    WindowStyle="None"
    WindowState="Normal" 
    ResizeMode="CanResize"
    >
<WindowChrome.WindowChrome>
    <WindowChrome 
        CaptionHeight="0"
        ResizeBorderThickness="5" />
</WindowChrome.WindowChrome>

    <Grid>

    <Rectangle Fill="#D53736" HorizontalAlignment="Stretch" Height="35" VerticalAlignment="Top" PreviewMouseDown="Rectangle_PreviewMouseDown" />
    <Button x:Name="Btnclose" Content="r" HorizontalAlignment="Right" VerticalAlignment="Top" Width="35" Height="35" Style="{StaticResource TempBTNclose}"/>
    <Button x:Name="Btnmax" Content="2" HorizontalAlignment="Right" VerticalAlignment="Top" Margin="0,0,35,0" Width="35" Height="35" Style="{StaticResource TempBTNclose}"/>
    <Button x:Name="Btnmin" Content="0" HorizontalAlignment="Right" VerticalAlignment="Top" Margin="0,0,70,0" Width="35" Height="35" Style="{StaticResource TempBTNclose}"/>

</Grid>

شكرا لك!

في حين قبلت الجواب صحيح جدا ، أريد فقط أن أشير إلى أن AllowTransparency لديه بعض القصور.فإنه لا يسمح نافذة الطفل ضوابط تظهر أي WebBrowser ، وأنه عادة قوات تقديم البرامج التي يمكن أن يكون الأداء السلبي الآثار.

هناك عمل أفضل على الرغم من حولها.

عندما تريد إنشاء نافذة مع عدم وجود حدود لتغيير الحجم وغير قادرة على استضافة عنصر التحكم WebBrowser أو عنصر تحكم الإطار أشار إلى URL كنت ببساطة لا يمكن أن محتويات وقال التحكم سوف تظهر فارغة.

لقد وجدت الحل على الرغم ؛ في النافذة إذا قمت بتعيين WindowStyle إلى لا شيء ، ResizeMode إلى NoResize (تتحمل معي, سوف لا يزال تكون قادرا على تغيير حجم فعلت مرة واحدة) ثم تأكد من أن لديك دون رادع AllowsTransparency سيكون لديك ثابت الحجم نافذة لا الحدود و سوف تظهر المتصفح التحكم.

الآن ربما كنت لا تزال تريد أن تكون قادرة على تغيير حجم أليس كذلك ؟ كذلك يمكننا ذلك مع إمكانية التشغيل المتداخل الاتصال:

    [DllImport("user32.dll", CharSet = CharSet.Auto)]
    private static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam);

    [DllImportAttribute("user32.dll")]
    public static extern bool ReleaseCapture();

    //Attach this to the MouseDown event of your drag control to move the window in place of the title bar
    private void WindowDrag(object sender, MouseButtonEventArgs e) // MouseDown
    {
        ReleaseCapture();
        SendMessage(new WindowInteropHelper(this).Handle,
            0xA1, (IntPtr)0x2, (IntPtr)0);
    }

    //Attach this to the PreviewMousLeftButtonDown event of the grip control in the lower right corner of the form to resize the window
    private void WindowResize(object sender, MouseButtonEventArgs e) //PreviewMousLeftButtonDown
    {
        HwndSource hwndSource = PresentationSource.FromVisual((Visual)sender) as HwndSource;
        SendMessage(hwndSource.Handle, 0x112, (IntPtr)61448, IntPtr.Zero);
    }

وفويلا ، WPF نافذة لا الحدود و لا يزال المنقولة و يمكن تغيير حجم دون فقدان التوافق مع الضوابط مثل WebBrowser

عينة هنا:

<Style TargetType="Window" x:Key="DialogWindow">
        <Setter Property="AllowsTransparency" Value="True"/>
        <Setter Property="WindowStyle" Value="None"/>
        <Setter Property="ResizeMode" Value="CanResizeWithGrip"/>
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type Window}">
                    <Border BorderBrush="Black" BorderThickness="3" CornerRadius="10" Height="{TemplateBinding Height}"
                            Width="{TemplateBinding Width}" Background="Gray">
                        <DockPanel>
                            <Grid DockPanel.Dock="Top">
                                <Grid.ColumnDefinitions>
                                    <ColumnDefinition></ColumnDefinition>
                                    <ColumnDefinition Width="50"/>
                                </Grid.ColumnDefinitions>
                                <Label Height="35" Grid.ColumnSpan="2"
                                       x:Name="PART_WindowHeader"                                            
                                       HorizontalAlignment="Stretch" 
                                       VerticalAlignment="Stretch"/>
                                <Button Width="15" Height="15" Content="x" Grid.Column="1" x:Name="PART_CloseButton"/>
                            </Grid>
                            <Border HorizontalAlignment="Stretch" VerticalAlignment="Stretch" 
                                        Background="LightBlue" CornerRadius="0,0,10,10" 
                                        Grid.ColumnSpan="2"
                                        Grid.RowSpan="2">
                                <Grid>
                                    <Grid.ColumnDefinitions>
                                        <ColumnDefinition/>
                                        <ColumnDefinition Width="20"/>
                                    </Grid.ColumnDefinitions>
                                    <Grid.RowDefinitions>
                                        <RowDefinition Height="*"/>
                                        <RowDefinition Height="20"></RowDefinition>
                                    </Grid.RowDefinitions>
                                    <ResizeGrip Width="10" Height="10" Grid.Column="1" VerticalAlignment="Bottom" Grid.Row="1"/>
                                </Grid>
                            </Border>
                        </DockPanel>
                    </Border>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top