getadornerlayer عودة غامضة فارغة
-
27-09-2019 - |
سؤال
لقد كنت أستخدم نفس جزء الكود لعدة إصدارات من تطبيقي دون أي مشاكل ، لكنني أتلقى الآن بطريقة غامضة NullRerefenceException
S مع ما يلي:
this.Loaded += delegate {
deleteBrush = new DeleteBrushAdorner( background );
AdornerLayer al = AdornerLayer.GetAdornerLayer( background );
al.Add( deleteBrush ); // null ref here??
};
background
ما هو الا Border
عنصر.
فكرتي حول ما يمكن أن يتسبب في ذلك أ) التحول إلى .NET 4.0 و ب) وضع مثيلات العنصر أعلاه (وهو أ UserControl
) في ItemsControl
.
من الغريب أن هذا لا يحدث طوال الوقت ، ومن الصعب التنبؤ بموعد حدوث ذلك ، لذلك لا يمكن الاعتماد عليه.
المحلول
المستندات ل AdornerLayer.getAdornerLayer حدد:
إذا لم يتم العثور على طبقات مزينة ، فإن الطريقة تعود فارغة.
لذا أعتقد أنه لا توجد طبقات مزينة ... هل لديك أي سبب للاعتقاد بأن هذا لا ينبغي أن يكون كذلك؟ ما الضمان الذي تعتمد عليه حاليًا على أنه ستكون هناك طبقة مزينة في الشجرة المرئية؟
نصائح أخرى
أعلم أن هذا سؤال قديم ولكن كان لدي هذه القضية اليوم.
في حالتي ، كان لدي فصل يعتمد على Window
و GetAdornerLayer()
عاد لاغية. اتضح أن ControlTemplate
لصفتي المشتقة لا تحتوي على AdornerDecorator
. مضيفا ذلك على أنه المستوى الأعلى في ControlTemplate
حل القضية.
<Style TargetType="my:MyWindow" BasedOn="{StaticResource {x:Type Window}}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="my:MyWindow">
<AdornerDecorator>
<DockPanel ...>
</DockPanel>
</AdornerDecorator>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
أنا فضولي بشأن ما إذا كان هذا قد تم حل هذا بالفعل أم لا. يوفر AdornerDecorator مجموعة من الأملس للعنصر الموجود أدناه - وسيكون كل شيء تحتها. إنه ديكور ، مما يعني أنه يحتوي على طفل هو المحتوى. يتم تزويد هذا المحتوى بمزين. لذلك ، إذا وضعت AdornerDecorator في XAML الخاص بك والطفل هو الحدود ، فإن الحدود لديها مزيج.
علاوة على ذلك ، يعرّف النافذة مجموعة adornerDecorator على أنها الجزء العلوي من الشجرة المرئية بحيث يكون لأي عنصر في النافذة مجموعة من الزملاء فوقها. لذا ، إذا كان المكون من الملاذ أعلاه في نافذة ...