Flex - كيفية تغيير ارتفاع القائمة المنسدلة المفتوحة
-
21-09-2019 - |
سؤال
باستخدام FB4 ، أريد تغيير ارتفاع قائمة القائمة المنسدلة Open Spark. بشكل افتراضي ، يظهر ما يصل إلى 6 عناصر قبل التمرير. يحتوي SropDownList الخاص بي على 7 عناصر ، لذلك أريد تغيير ارتفاع قائمة القائمة المنسدلة المفتوحة لتناسب جميع العناصر السبعة دون التمرير. كحل بديل ، قمت بتغيير حجم الخط للعناصر بحيث تكون أصغر و 7 مناسبة ، لكن الخط الأصغر لا يبدو جيدًا. هل هناك طريقة لتغيير هذا الارتفاع؟ أنا جديد إلى حد ما في Flash ، لذلك إذا كان حلًا معقدًا ، فيرجى التفصيل :-).
المحلول
القضية ، في Flex 4 ، تم تعريف المنسدلة listskin maxHeight="134"
للبشرة الافتراضية التي ربما تستخدمها. هذا يجبر شريط التمرير على الظهور إذا تمتد الكائنات إلى ما وراء هذا الارتفاع. كل ما عليك فعله هو نسخ/لصق رمز الانسداد في بشرة مخصصة ، وتطبيق ذلك على القائمة المنسدلة عبر CSS:
variableHeightDropdownlistskin
<?xml version="1.0" encoding="utf-8"?>
<s:Skin xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
alpha.disabled=".5">
<!-- host component -->
<fx:Metadata>
<![CDATA[
/**
* @copy spark.skins.spark.ApplicationSkin#hostComponent
*/
[HostComponent("spark.components.DropDownList")]
]]>
</fx:Metadata>
<s:states>
<s:State name="normal" />
<s:State name="open" />
<s:State name="disabled" />
</s:states>
<s:PopUpAnchor id="popUp" displayPopUp.normal="false" displayPopUp.open="true" includeIn="open"
left="0" right="0" top="0" bottom="0" itemDestructionPolicy="auto"
popUpPosition="below" popUpWidthMatchesAnchorWidth="true">
<!-- removed maxHeight! -->
<s:Group id="dropDown" minHeight="22">
<!-- border/fill -->
<s:Rect left="0" right="0" top="0" bottom="0">
<s:stroke>
<s:SolidColorStroke color="0x5380D0" />
</s:stroke>
<s:fill>
<s:SolidColor color="0xFFFFFF" />
</s:fill>
</s:Rect>
<s:Scroller left="0" top="0" right="0" bottom="0" focusEnabled="false" minViewportInset="1">
<s:DataGroup id="dataGroup" itemRenderer="spark.skins.spark.DefaultItemRenderer">
<s:layout>
<s:VerticalLayout gap="0" horizontalAlign="contentJustify"/>
</s:layout>
</s:DataGroup>
</s:Scroller>
<s:filters>
<s:DropShadowFilter blurX="20" blurY="20" distance="7" angle="90" alpha="0.45" color="0x6087CC" />
</s:filters>
</s:Group>
</s:PopUpAnchor>
<s:Button id="openButton" left="0" right="0" top="0" bottom="0" focusEnabled="false"
skinClass="spark.skins.spark.DropDownListButtonSkin" />
<s:Label id="labelDisplay" verticalAlign="middle" lineBreak="explicit"
mouseEnabled="false" mouseChildren="false"
left="7" right="30" top="2" bottom="2" width="75" verticalCenter="1" />
</s:Skin>
نموذج التطبيق
<?xml version="1.0" encoding="utf-8"?>
<s:Application
xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:mx="library://ns.adobe.com/flex/mx">
<fx:Style>
@namespace mx "library://ns.adobe.com/flex/mx";
@namespace s "library://ns.adobe.com/flex/spark";
s|DropDownList
{
skinClass: ClassReference("VariableHeightDropDownListSkin");
}
</fx:Style>
<s:DropDownList labelField="name" horizontalCenter="0" verticalCenter="0">
<s:layout>
<s:VerticalLayout requestedRowCount="7"/>
</s:layout>
<s:dataProvider>
<mx:ArrayCollection>
<fx:Object name="one"/>
<fx:Object name="two"/>
<fx:Object name="three"/>
<fx:Object name="four"/>
<fx:Object name="five"/>
<fx:Object name="six"/>
<fx:Object name="seven"/>
</mx:ArrayCollection>
</s:dataProvider>
</s:DropDownList>
</s:Application>
اسمحوا لي أن أعرف إذا كان ذلك يساعد ، لانس
نصائح أخرى
أليس من الأسهل إذا كنت تستخدم الخاصية طلب requestedRowCount من Verticallayout؟
<s:DropDownList dataProvider="{myDataProvider}">
<s:layout>
<s:VerticalLayout requestedRowCount="10"/>
</s:layout>
</s:DropDownList>
ستعمل إجابة ViatroPos ، ومع ذلك يجب أن تحاول تجنب تجاوز الجلد بأكمله قدر الإمكان.
في هذه الحالة ، ستلاحظ أنه في رمز ViatroPos المتغير HightDropdownlistskin أن المجموعة التي أزال فيها سمة Maxheight ، يوجد أيضًا "معرف" محدد.
انظر الآن إلى الوثائق الخاصة بـ DropDownList وستلاحظ في قسم SkinParts أن هناك جزءًا من الجلد "المنسدلة". هذا هو في الواقع خاصية القائمة المنسدلة.
لذا ، بدلاً من تجاوز الجلد ، يمكنك ببساطة استخدام ActionScript (يمكنني استخدام uicomponent.default_max_height هنا ، ولكن يمكنك استخدام أيهما تريد):
(MyDropDownList.dropDown as UIComponent).maxHeight = UIComponent.DEFAULT_MAX_HEIGHT;
لسوء الحظ ، هذا أكثر تعقيدًا في Flex 4 مما كان عليه في Flex 3:
يجب أن تكون قادرًا على تحديد تصميم القائمة المنسدلة بأعلى requestedRowCount
(التفاصيل هنا) ، ولكن بالنسبة لـ> 6 صفوف تحتاج إلى القيام بالمزيد من العمل (قضية فليكس SDK-25364).
في FB3 ، فإن ROLCOUNT لأن القائمة المنسدلة هي سليل من التحكم في القائمة. FB4 ربما متشابه.
myDropdown.rowCount = 7;
عادة ما أستخدم شيئًا أكثر مثل
myDropdown.rowCount = myDataProvider.lenght();