ما هو الفرق بين العرض والعرض الفعلي في WPF؟
-
03-07-2019 - |
سؤال
أنا أعمل حاليا مع Panel
S في WPF ، ولاحظت ذلك فيما يتعلق Width
و Height
الخصائص ، هناك أيضًا خصائصان أخريان تسمى ActualWidth
و ActualHeight
.
ActualWidth
يحصل على عرض المقدمة لهذا العنصر. هذه خاصية التبعية. (ورثت من الإطار.)
Width
يحصل أو تعيين عرض العنصر. هذه خاصية التبعية. (ورثت من الإطار.)
المرجعي: MSDN
هل يمكن لأي شخص أن يشير الاختلافات بين الاثنين ومتى تستخدم أي واحد؟
المحلول
Width
/Height
هل طلب أو تخطيط بحجم. إذا قمت بتعيين على Auto ، فإن القيمة هي double.NaN
عند الوصول إلى العقار في الكود وراء.
ActualWidth
/ActualHeight
هل المقدمة بحجم. إذا كنت تريد/تحتاج إلى الحجم الفعلي للعنصر ، فاستخدم هذه السمة.
نصائح أخرى
وجدت ActualWidth
الأكثر فائدة عندما أرغب في ربط عرض أو ارتفاع عنصر إلى آخر.
في هذا المثال البسيط ، لديّ زرعان مرتبة جنبًا إلى جنب وتعليق تحتها مقيد بعرض stackpanel الذي يحتوي على الأزران.
<StackPanel>
<StackPanel Margin="0,12,0,0" Orientation="Horizontal" Name="buttonPanel" HorizontalAlignment="Left" >
<Button Content="Yes - Arm the missile" FontWeight="Bold" HorizontalAlignment="Left"/>
<Button Content="No - Save the world" HorizontalAlignment="Left" Margin="7,0,0,0"/>
</StackPanel>
<TextBlock Text="Please choose whether you want to arm the missile and kill everybody, or save the world by deactivating the missile."
Width="{Binding Path=ActualWidth,ElementName=buttonPanel}" Margin="0,5,0,0" HorizontalAlignment="Left" TextWrapping="Wrap"/>
</StackPanel>
ActualWidth
حسابات الحشو في القيمة ، لذلك في أي وقت تحتاج إلى معرفة هذا الرقم الذي يمكنك الاتصال به Actualwidth
بدلا من العرض وتجنب الحساب.
تحرير: الهامش الذي تم إزالته ب/ج ، إنه ليس جزءًا من العرض الفعلي.
ActualWidth
تم تعيينه بواسطة نظام التقديم ، وقد يكون مختلفًا اعتمادًا على عرض العناصر الأخرى وقيود الحجم الكلي. نتيجة لذلك ، لا يمكن تغييره. Width
هي خاصية يمكن تغييرها ، ويجب استخدامها لزيادة أو تقليل عرض العنصر.
من MSDN:
هذه الخاصية هي قيمة محسوبة على أساس مدخلات العرض الأخرى ، ونظام التخطيط. يتم تعيين القيمة بواسطة نظام التخطيط نفسه ، استنادًا إلى تمريرة عرض فعلية ، وبالتالي قد تتخلف قليلاً عن القيمة المحددة للخصائص مثل
Width
وهذا هو أساس تغيير المدخلات.
هناك سبب وجيه جدا عدم استخدام ActualWidth
لربط (من الواضح ActualHeight
وفقاً لذلك). عندما تقوم بتعيين Width
لعنصر ، إلى ActualWidth
من آخر يمكنك كسر سلسلة التصميم.
في أفضل حالات ، يجب تحليل العنصر/التحكم الخاص بك بعد انتهاء عملية تخطيط الوالد (مصدر الربط). وهذا يعني وقت إضافي. إذا كان في نفس مستوى التسلسل الهرمي مثل الوالد ، فإن عملية التخطيط تحتاج إلى شوطين (على الأقل) لحساب حجم نهائي.
على سبيل المثال ، كان لديّ تحكم كان قد تجاوز حجم خاصية الحجم بأسلوب من شأنه أن يضعه على TemplatedParent
(لا تفعل):
<Rectangle DockPanel.Dock="Top" Width="{TemplateBinding ActualWidth}"
Height="1" Fill="#000000"/>
عند تغيير حجم النافذة المحتوية ، فإن التحكم سيمنع الحاوية من أن تصبح أصغر وتكبح التصميم. وضعه على Width
سوف يحل المشكلة (فعل):
<Rectangle DockPanel.Dock="Top" Width="{TemplateBinding Width}"
Height="1" Fill="#000000"/>
إذا كان عليك استخدام ActualWidth
بشكل عام ، هناك خطأ ما في XAML الخاص بك. من الأفضل إصلاح ذلك بدلاً من العبث بالأحجام النهائية لتشغيل التخطيط.
هذا بالضبط ، عرض العرض! = عرض التخطيط. واحد يهدف إلى استخدامه للتخطيط ، والآخر مخصص للعرض. كما هو الحال مع WinForms ، كان هناك حجم وعملاء عملاء ، ويختلف قليلاً ويجب عليك استخدام حجم العميل/العميل من العرض والعرض/الارتفاع للتخطيط.
يمكنك تعيين ملف Width
الممتلكات ، ولكن ليس ActualWidth
منشأه.
ال Width
يتم استخدام الخاصية لتحديد كيفية تقديم اللوحة ، ثم ActualWidth
تم تعيينه على العرض الفعلي الذي تم استخدامه. قد لا تكون هذه هي نفس قيمة العرض ، اعتمادًا على حجم عناصرها الفرعية والتقودات من العنصر الوالد.
ال ActualWidth
لم يتم تعيينه على الفور عند ضبط Width
خاصية ، ولكن سيتم تحديثها (مرة واحدة أو أكثر) أثناء التقديم.