PDA

View Full Version : سوال: بدست آوردن سایز المنت داخل Grid



hamed jalili
سه شنبه 13 دی 1390, 11:18 صبح
با سلام ،

من یک Canvas دارم که در داخل یک Grid قرار گرفته ، طول و عرض Canvas به Auto تنظیم شده ( برای اینکه هر موقع تغییر سایزی در Grid رخ داد ، Canvas هم تغییر سایز بده ) .
سوال اینجاست ، چه طور می تواند سایز این Canvas را در موقع اجرا به دست بیاورم .

از روش های زیر هم استفاده کردم ، ولی روش اول NaN میده و روش دوم 0 !!




double H = A_Canvas.Height;

P_H = A_Canvas.ActualHeight;

Amir Oveisi
سه شنبه 13 دی 1390, 11:57 صبح
canvas رو قرار بديد داخل يك border بعد متد Measure كنترلي رو كه ميخوايد size اش رو بدست بياريد فراخواني كنيد:
yourcontrol.Measure(new Size(double.PositiveInfinity, double.PositiveInfinity));
اين كار باعث ميشه كنترل شما محاسبه كنه كه قراره چه size اي داشته باشه و مقدار بدست اومده رو تو property به اسم DesiredSize قرار بده:
double height= yourcontrol.DesiredSize.Height;
double width = yourcontrol.DesiredSize.Width;

تست كنيد ببينيد چه نتيجه اي ميده

hamed jalili
سه شنبه 13 دی 1390, 12:46 عصر
با تشکر ،

من از کد شما استفاده کردم ، ولی مشکل حل نشد !

کد شما همان مقدار 0 را بر میگردونه !!

ScreenShot ها رو اینجا Upload کردم


http://www.freeimagehosting.net/1d8d5

http://www.freeimagehosting.net/03851

Amir Oveisi
سه شنبه 13 دی 1390, 16:19 عصر
canvas رو داخل border‌ قرار دادید؟
آیا برای canvas تون style استفاده کردید؟


ScreenShot ها رو اینجا Upload کردم
لینکش نیست

مهدی فرزاد
سه شنبه 13 دی 1390, 16:46 عصر
سلام
باز طبق معمول من میخوام یکدفعه بپرم وسط بحث!!!!
میتونم دلیل استفاده شما رو از کنترل canvas بدونم ؟؟!! و اینکه چرا میخواید سایزش رو اندازه بگیرید؟؟
( هرچند سئوال من در ابتدا بی ربط به بحث بنظر میاد !!! اما ممکنه برای کارهای که میخواید انجام بدید راه دیگه ای باشه)

حالا بحث شما

چند دلیل وجود داره که کد دوم شما بهتون عدد 0 رو میده
1 قبل از اینکه المنت سایزش تغییر کنه دارید اون رو اندازه میگیرید
2 کنترل شما درون گرید Stretch نشده

<Grid>
<Canvas HorizontalAlignment="Stretch" Margin="10,10,0,0" Name="canvas1" VerticalAlignment="Stretch"/>

</Grid>

hamed jalili
سه شنبه 13 دی 1390, 17:55 عصر
ScreenShot ها رو به صورت عکس گذاشته بودم ، ولی نمی دونم چرا Load نمی شد در هر صورت ، عکس ها را ضمیمه می کنم


از Canvas استفاده می کنم برای اینکه راحت تر می تونم موقعیت یک کنترلر رو درون Canvas کنترل کنم .
و برای این می خواهم سایزش رو اندازه بگیرم که چون برنامه ام قرار هست یک ماتریس مثلا 20 در 20 رو درون Canvas بکشه ، و سایز هر خانه ماتریس رو من به صورت زیر حساب میکنم .



P_H = Convert.ToDouble(New_Figure_Canvas.ActualHeight) / max_y;
P_W = Convert.ToDouble(New_Figure_Canvas.ActualWidth) / max_x;


علت هایی که فرموده بودین رو من کنترل کردم ، دلیل مشکل مورد اول بود ، یعنی قبل از اینکه سایز Canvas به سایز جدید ( بزرگتر یا کوچکتر شده به نسبت تغییر سایز Window اصلی ) تغییر کنه سایزش رو اندازه می گیرم !
ولی اینجا باز هم دو مورد وجود دارد
1- با اینکه Canvas هنوز تغییر سایز نداده ، ولی باز هم سایز اول که موقع طراحی گرفته را حداقل باید برگرداند ، مگه نه ؟! در صورتی که 0 بر می گرداند.
2- Canvas داخل TabControl هست و در اندیس دوم TabControl قرار دارد ، برنامه من اصولا به این صورت عمل می کند با کلیک بر روی یک دکمه ، تب دوم به صورت اتوماتیک نمایش داده می شود و بعد کار کشیدن Gird باز سایز های داده شده شروع می شود ، که در این حالت من 0 را به عنوان طول و عرض Canvas دریافت می کنم . ولی اگر قبل از اینکه بر روی دکمه کلیک کنم ، اول به صورت دستی به تب دوم بروم و بعد به تب اول برگردم ، بعد بر روی دکمه کلیک کنم ، سایز درستی را دریافت می کنم !!!

چه طور می توانم این مشکل رو حل کنم ؟

مهدی فرزاد
چهارشنبه 14 دی 1390, 08:12 صبح
سلام
علت اینکه در مرحله اول سایز 0 هست اینه که هنوز آیتم های Tab دوم لود نشده و بنابر این همون اندازه اولیه رو هم نداره
من الان راه اصولی بذهنم نرسید یک ترفند ( شاید غیر اصولی) به شما میگم ولی زمانی کاربرد داره که فقط دوتا Tab داشته باشی
اول در کد Xaml خاصیت IsSelected مربوط به tab دوم رو برابر True قرار بده
حالا توی متد سازنده فرمت بنویسی
public MainWindow()
{
InitializeComponent();
this.tabItem1.Focus();

}

با اینکار اول تب دوم لود میشه و بعد میاد رو تب اول و دیگه مقدار رو درست بر میگردونه

hamed jalili
چهارشنبه 14 دی 1390, 11:00 صبح
ممنون از راهنماییتون .

دو روش هم به ذهن من رسیده بود که من روش دوم رو پیاده کردم و جواب هم میده

اما روش ها :

1- با یک تابع همروند منتظر Load شدن Canvas بمونم بعد از Load شدن سایز اونو بخونم
2- چون tab1 و tab2 دارای سایز های یکسانی هستند ، بنابراین اگر سایز Canvas را از حالت Auto خارج کنیم و در هنگام Load شدن tab2 به جای اینکه سایز Canvas را بخوانیم ، با استفاده از سایز tab1 به Canvas سایز بدهیم ، عملا مشکل حل میشود .

اگر راه اصولی تری به ذهن شما رسید ، لطفا به ما هم اطلاع بدید .