PDA

View Full Version : سوال: اندازه فرم



water_lily_2012
چهارشنبه 17 فروردین 1390, 09:29 صبح
سلام
براي اينكه اندازه فرمم از 600*800 كوچكتر نشود و فقط بتوان آن را هم با موس با گرفتن حاشيه و هم با دكمه Max بزرگ كرد بايد چه كار كرد. يعني همانند فرم هاي ويندوز عمل كنه فقط از اندازه گفته شده هم كوچكتر نشه.
فرم AllowsTrancparency هست.

مهدی فرزاد
چهارشنبه 17 فروردین 1390, 13:40 عصر
برای تغییر دادن اندازه هم با موس و هم با دکمه به نمونه سمپلی که من در سایت قرار دادم مراجعه کنید تمام حالت های مختلف یک ویندوز استاندارد وجود دارد
کمی با دقت اون مثال رو بررسی کنید تمام سئوالات شما پاسخ داده خواهد شد

برای اینکه حداقل تا اندازه 800 *600 کوچک شود باید خاصیت های MinWidht و MinHeightرو تنظیم کنید

water_lily_2012
چهارشنبه 17 فروردین 1390, 15:13 عصر
كدام سمبل.

مهدی فرزاد
چهارشنبه 17 فروردین 1390, 18:48 عصر
http://barnamenevis.org/showthread.php?275221-اصلاح-عدم-نمایش-Taskbar-ویندوز-در-حالت-ماکزیماز-شدن-هنگامی-که-برای-ویندوز-استایل-تعریف-شده-باشد

water_lily_2012
پنج شنبه 18 فروردین 1390, 11:40 صبح
MinWidth و MinHeight را تعيين كردم و كدهاي كلاس WindowManager را نيز اضافه كردم و برنامه بدون خطا اجرا شد. اما وقتي دستورات فايل استايل را اضافه كردم(از فايل شما كپي كردم) حدود 10 تا خطا داد و برنامه اجرا نشد. در نتيجه همه را پاك كردم و دستور زير را نوشتم، برنامه اجرا شد ولي دستورات عمل نكرد.

<Style x:Key="MainForm" TargetType="{x:Type Window}">
<Setter Property="WindowStyle" Value="None"/>
<Setter Property="Background" Value="Transparent"/>
<Setter Property="FontFamily" Value="Tahoma"/>
<Setter Property="FontSize" Value="10"/>
<Setter Property="FontWeight" Value="Normal"/>

<EventSetter Event="Loaded" Handler="Load"/>
<Setter Property="AllowsTransparency" Value="True"/>
<Setter Property="MinHeight" Value="600"/>
<Setter Property="MinWidth" Value="800"/>
</Style>
البته فرم من همانند فرم شما طراحي نشده است. لطفا راهنمايي كنيد.

farashah_jalal
پنج شنبه 18 فروردین 1390, 11:54 صبح
بايد در app تنظيم كني كه style هاي كه داري در كدام پوشه قرار دارد.در داخل application.resourceكه در كد هاي xaml اين پنجره تعريف كني.
اما به هر حال مي توني كد هاي كه دچار مشكل هستند و خطا مي دهند رو بزاري تا اون رو بررسي كنيم.

مهدی فرزاد
پنج شنبه 18 فروردین 1390, 12:17 عصر
اون کلاس و اون کدها بر اساس استایلی که من ساختم کار میکنه شما استایلتون رو بگذارید تا بررسی کنم

water_lily_2012
پنج شنبه 18 فروردین 1390, 12:44 عصر
لطفا هر كاري مي كنيد بنويسيد تا من هم ياد بگيرم اشكال كارم از كجاست.
با تشكر

مهدی فرزاد
پنج شنبه 18 فروردین 1390, 15:54 عصر
سلام
من استایل شما رو درست کردم به این شکل که( در انتهای پست فایل ضمضمه رو دانلود کنید)
ابتدا برای اون Event Loaded رو تعریف کردم تا کدهایی که در متد Load کلاس ویندوز منیجر نوشتید عمل کنه(خط شماره 9 در کد XAML استایل در قسمت کدهای x:Key="MainFormLibrary" )
<EventSetter Event="Loaded" Handler="Load"/>
در ضمن اون قسمت کد رو که به نام MainForm در استایل نوشته بودید رو پاک کردم اصلا بهش نیازی نیست!!!

این برای اصلاح حالت ماکزیمایز فرم که TaskBar ویندوز مشخص باشه

بعد
Border اصلی استایل رو(MainBorder) در یک Grid قرار دادم تا بتونم در کنار اون دو کنترل دیگه هم اضافه کنم
اون دو کنترل اینها هستند HorizontalResiingRext و VerticalResiingRext که از نوع Rectangle هستند و اولی به سمت راست فرم چسبیده و دومی به پایین فرم , کار اونها اینه که بوسیله اونها بفهمیم موس در قسمت راست یا پایین فرم قرار گرفته . کاربر میخواد سایز رو تغییر بده
این عکس در Blend
68421

و این هم کدهای Xaml
<Rectangle
x:Name="HorizontalResiingRext"
Grid.RowSpan="1"
HorizontalAlignment="Right"
VerticalAlignment="Stretch"
Margin="144.834,0,0,0"
Width="5"
Fill="Transparent"
MouseLeftButtonDown="Window_StartResizingHorizontally"
MouseMove="Window_Resize"
MouseLeftButtonUp="Window_ResieEnded"
MouseEnter="HorizontialllyRect_MouseEnter"
/>
<Rectangle
x:Name="VerticalResiingRext"
Grid.ColumnSpan="1"
Grid.Row="0"
HorizontalAlignment="Stretch"
Height="5"
Margin="0,47.96,0,0"
VerticalAlignment="Bottom"
Fill="Transparent"
MouseLeftButtonDown="Window_StartResizingVertically"
MouseMove="Window_Resize"
MouseLeftButtonUp="Window_ResieEnded"
MouseEnter="VerticallyRect_MouseEnter"
Width="Auto" d:LayoutOverrides="GridBox"
/>

خوب برای کار کردنش هم این کدها رو در کلاس استایل نوشتم



bool IsWindowResizing = false;
WindowResizeMode mode = WindowResizeMode.None;

void Window_StartResizingHorizontally(object sender, System.Windows.Input.MouseEventArgs e)

{

System.Windows.Shapes.
Rectangle rect = (System.Windows.Shapes.Rectangle)sender;

Window win = rect.TemplatedParent as Window;

if (win.ResizeMode == ResizeMode.CanResize || win.ResizeMode == ResizeMode.CanResizeWithGrip)

{

IsWindowResizing =
true;

mode =
WindowResizeMode.Horizontiallly;

}

 
}

void HorizontialllyRect_MouseEnter(object sender, System.Windows.Input.MouseEventArgs e)

{


System.Windows.Shapes.
Rectangle rect = (System.Windows.Shapes.Rectangle)sender;

Window win = rect.TemplatedParent as Window;

if ((win.ResizeMode == ResizeMode.CanResize || win.ResizeMode == ResizeMode.CanResizeWithGrip) && win.WindowState != WindowState.Maximized)


rect.Cursor = System.Windows.Input.
Cursors.SizeWE;

else

rect.Cursor = win.Cursor;
 

}



void VerticallyRect_MouseEnter(object sender, System.Windows.Input.MouseEventArgs e)

{


System.Windows.Shapes.
Rectangle rect = (System.Windows.Shapes.Rectangle)sender;



Window win = rect.TemplatedParent as Window;

if ((win.ResizeMode == ResizeMode.CanResize || win.ResizeMode == ResizeMode.CanResizeWithGrip) && win.WindowState != WindowState.Maximized)

rect.Cursor = System.Windows.Input.
Cursors.SizeNS;

else

rect.Cursor = win.Cursor;

 

}

 

void Window_StartResizingVertically(object sender, System.Windows.Input.MouseEventArgs e)

{

System.Windows.Shapes.
Rectangle rect = (System.Windows.Shapes.Rectangle)sender;

Window win = rect.TemplatedParent as Window;

if (win.ResizeMode == ResizeMode.CanResize || win.ResizeMode == ResizeMode.CanResizeWithGrip)

{

IsWindowResizing =
true;

mode =
WindowResizeMode.Vertically;

}
 

}

void Window_Resize(object sender, System.Windows.Input.MouseEventArgs e)

{

System.Windows.Shapes.
Rectangle rect = (System.Windows.Shapes.Rectangle)sender;



Window win = ((System.Windows.Shapes.Rectangle)sender).Template dParent as Window;

if (win != null && this.mode != WindowResizeMode.None)

{

rect.CaptureMouse();

switch (this.mode)

{

case WindowResizeMode.Horizontiallly:

{

double width = e.GetPosition(win).X + 5;

if (width > 0 && width >= win.MinWidth)

win.Width = width;

}

break;

case WindowResizeMode.Vertically:

{

double height = e.GetPosition(win).Y + 5;

if (height > 0 && height >= win.MinHeight)

win.Height = height;

}


break;

}

}

}
void Window_ResieEnded(object sender, System.Windows.Input.MouseEventArgs e)

{


IsWindowResizing =
false;


mode =
WindowResizeMode.None;


System.Windows.Shapes.
Rectangle rect = (System.Windows.Shapes.Rectangle)sender;

rect.ReleaseMouseCapture();

}
private enum WindowResizeMode

{

Horizontiallly,

Vertically,

None

}

من یک تغییر کوچیک هم در دکمه ماکزیمایز فرمتون ایجاد کردم تا وقتی فرم ماکزیمایز میشه شکل دکمه تغییر کنه
اومد با استفاده از کنترل Rectangle یک شکل برای حالت ماکزیمایز قرار دادم و در قسمت Triggers دکمه مشخص کردم اگه Tag دکمه برابر Max شد این اشکال مخفی بشه و اگه برار Restore شد آشکار بشه
68425
بعد در Triggers استایل مشخص کردم اگه ویندوز Normal بود Tag دکمه رو برابر Max قرار بده و اگر ویندوز Mazimized بور Tag دکمه رو برابر Restore و وقتی این اتفاق افتاد اون توضیحی که در بالا برای دکمه دادم اجرا میشه
68424