كيفية إنشاء نافذة WPF دون الحدود التي يمكن أن تكون تغيير حجمها عن طريق قبضة فقط ؟
-
03-07-2019 - |
سؤال
إذا قمت بتعيين ResizeMode="CanResizeWithGrip"
على WPF Window
ثم تغيير حجم قبضة يظهر في الزاوية اليمنى السفلى ، على النحو التالي:
إذا قمت بتعيين WindowStyle="None"
كذلك يختفي شريط العنوان ولكن رمادي مشطوف حافة يبقى حتى تعيين ResizeMode="NoResize"
.للأسف مع هذا المزيج من الخصائص تعيين حجم قبضة أيضا يختفي.
لقد تجاوز Window
's ControlTemplate
طريق مخصص Style
.أريد أن تحديد الحدود من النافذة نفسي و لا حاجة للمستخدمين لتكون قادرة على تغيير حجم نافذة من جميع الجوانب الأربعة ، ولكن أنا بحاجة إلى تغيير حجم قبضة.
يمكن للشخص تفاصيل طريقة بسيطة لتلبية جميع هذه المعايير ؟
- لا وقد الحدود على
Window
وبصرف النظر عن واحد أحدد نفسي فيControlTemplate
. - هل يكون عامل تغيير حجم قبضة في الزاوية اليمنى السفلى.
- لا يكون شريط العنوان.
المحلول
إذا قمت بتعيين 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"
لكن عندما اختبرت ذلك ، يبدو أن يظهر شريط أبيض في الأعلى, بعد بعض البحوث يبدو أن "تغيير الحدود" ، وهنا صورة (لاحظ أنا في الأصفر):
بعد بعض البحث على الإنترنت ، والكثير من الصعب عدم 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 لأنني أحب هذا العدد ، لأنه إذا وضعت صفر من الصعب تغيير حجم النافذة.
بعد استخدام هذا الرمز القصير النتيجة هو هذا:
و الآن الحدود البيضاء اختفت دون استخدام 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>