باستخدام XamlReader لعناصر التحكم التي لا تحتوي على مُنشئ افتراضي

StackOverflow https://stackoverflow.com/questions/2335900

  •  22-09-2019
  •  | 
  •  

سؤال

لدي بعض تمثيلات سلسلة كائنات XAML ، وأريد بناء عناصر التحكم. أنا أستخدم XamlReader.Parse وظيفة للقيام بذلك. لعنصر تحكم بسيط مثل الزر يحتوي على مُنشئ افتراضي لا يأخذ أي معلمات ، يعمل هذا بشكل جيد:

var buttonStr = "<Button xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\">Text</Button>";
var button = (Button)XamlReader.Parse(buttonStr); 

ومع ذلك ، عندما أحاول القيام بذلك على سبيل المثال ، فشل التحكم في السكتة الدماغية. أولا حاول السكتة الدماغية البسيطة:

var strokeStr = "<Stroke xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"></Stroke>";
var stroke = (Stroke)XamlReader.Parse(strokeStr);

هذا يعطي الخطأ:

لا يمكن إنشاء كائن من النوع "system.windows.ink.stroke". فشل CreateInstance ، والذي يمكن أن يكون سبب عدم وجود مُنشئ افتراضي عام لـ 'System.windows.ink.stroke'.

في تعريف السكتة الدماغية ، أرى أنه يحتاج على الأقل إلى إنشاء قلم. أفترض أن هذا هو ما يخبرني به الخطأ ، على الرغم من أنه كان على افتراض أن هذا سيتعامل معه XamlReader. محاولة تحويل xaml من السكتة الدماغية مع نقاط القلم فيه تعطي نفس الخطأ:

var strokeStr = 
    "<Stroke xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\">" + 
        "<Stroke.StylusPoints>" + 
            "<StylusPoint X=\"100\" Y=\"100\" />" +
            "<StylusPoint X=\"200\" Y=\"200\" />" + 
        "</Stroke.StylusPoints>" + 
    "</Stroke>";
var stroke = (Stroke) XamlReader.Parse(strokeStr);

ما الخطأ الذي افعله؟ كيف أخبر XamlReader كيفية إنشاء السكتة الدماغية بشكل صحيح؟

هل كانت مفيدة؟

المحلول

إنها "ميزة" لغة XAML ، إنها تصريحية ولا تعرف أي شيء عن المُنشئين.

الناس تستخدم ObjectDataprovider في XAML إلى "ترجمة" ولف حالات الفئات التي لا تحتوي على مُنشئ غير معلمة (إنه مفيد أيضًا لربط البيانات).

في حالتك ، يجب أن تبدو XAML مثل هذا:

<ObjectDataProvider ObjectType="Stroke">
    <ObjectDataProvider.ConstructorParameters>
        <StylusPointsCollection>
            <StylusPoint X="100" Y="100"/>
            <StylusPoint X="200" Y="200"/>
        </StylusPointsCollection>
    </ObjectDataProvider.ConstructorParameters>
</ObjectDataProvider>

ويجب أن يكون الرمز:

var stroke = (Stroke) ((ObjectDataProvider)XamlReader.Parse(xamlStr)).Data;

HTH.

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