سؤال

أنا أعمل حاليا مع PanelS في 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 خاصية ، ولكن سيتم تحديثها (مرة واحدة أو أكثر) أثناء التقديم.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top