سؤال

هل يعرف أحد ما إذا كان من الممكن ربط بيانات ScaleX وScaleY لتحويل العرض في Silverlight 2 Beta 2؟تحويلات الربط ممكنة في WPF - لكنني أتلقى خطأً عند إعداد الربط الخاص بي في Silverlight من خلال XAML.ربما من الممكن القيام بذلك من خلال الكود؟

<Image Height="60" HorizontalAlignment="Right" 
       Margin="0,122,11,0" VerticalAlignment="Top" Width="60" 
       Source="Images/Fish128x128.png" Stretch="Fill" 
       RenderTransformOrigin="0.5,0.5" x:Name="fishImage">
    <Image.RenderTransform>
         <TransformGroup>
             <ScaleTransform ScaleX="1" ScaleY="1"/>
             <SkewTransform/>
             <RotateTransform/>
             <TranslateTransform/>
         </TransformGroup>
    </Image.RenderTransform>
</Image>

أريد ربط ScaleX وScaleY لعنصر ScaleTransform.

أتلقى خطأ في وقت التشغيل عندما أحاول الارتباط بخاصية مزدوجة في سياق البيانات الخاص بي:

Message="AG_E_PARSER_BAD_PROPERTY_VALUE [Line: 1570 Position: 108]"

الارتباط الخاص بي يبدو كالتالي:

<ScaleTransform ScaleX="{Binding Path=SelectedDive.Visibility}" 
                ScaleY="{Binding Path=SelectedDive.Visibility}"/>

لقد تحققت ثلاث مرات من صحة مسار الربط - فأنا أقوم بربط شريط منزلق مقابل نفس القيمة وهذا يعمل بشكل جيد...

الرؤية من النوع المزدوج وهي رقم يتراوح بين 0.0 و 30.0.لدي محول قيمة يقوم بتحجيم هذا الرقم إلى 0.5 و1 - أريد تغيير حجم السمكة اعتمادًا على نقاء الماء.لذلك لا أعتقد أن هناك مشكلة في النوع الذي ألتزم به ...

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

المحلول

لا يحتوي ScaleTransform على سياق بيانات، لذا من المرجح أن يبحث الارتباط عن SelectedDive.Visibility بعيدًا عن نفسه ولا يعثر عليه.هناك الكثير في Silverlight xaml وربط البيانات الذي يختلف عن WPF...

على أي حال، لحل هذه المشكلة، ستحتاج إلى إعداد الربط في الكود**، أو الاستماع يدويًا إلى حدث PropertyChanged لكائن البيانات الخاص بك وتعيين المقياس في الكود خلفه.

سأختار الخيار الأخير إذا كنت تريد عمل رسم متحرك/قصة مصورة لتغيير الحجم.

** أحتاج إلى التحقق ولكن قد لا تتمكن من الالتزام به.على ما أذكر، إذا لم يكن RenderTransform جزءًا من الرسوم المتحركة، فسيتم تحويله إلى تحويل مصفوفة ويتم إيقاف جميع الرهانات.

نصائح أخرى

هل هو خطأ في وقت التشغيل أم وقت الترجمة يا جوناس؟أنظر إلى توثيق, تعد ScaleX وScaleY من الخصائص التبعية، لذا يجب أن تكون قادرًا على الكتابة

<ScaleTransform ScaleX="{Binding Foo}" ScaleY="{Binding Bar}" />

...حيث Foo وBar من النوع المناسب.

يحرر:بالطبع، هذه هي وثائق WPF.أفترض أنه من الممكن أنهم قاموا بتغيير ScaleX وScaleY ليكونا خصائص قياسية بدلاً من خصائص التبعية في Silverlight.أود أن أعرف المزيد عن الخطأ الذي تراه.

آه أعتقد أنني أرى مشكلتك.أنت تحاول ربط خاصية من النوع Visibility (SelectedDive.Visibility) بخاصية من النوع Double (ScaleTransform.ScaleX).لا يمكن لـ WPF/Silverlight التحويل بين هذين النوعين.

ماذا تحاول تحقيقه؟ربما يمكنني مساعدتك في XAML.ما هو "SelectedDive" وماذا تريد أن يحدث عندما تتغير رؤيته؟

عذرًا - كنت أبحث عن زيادة عدد الإجابات، لذا لم أدرك أنك قمت بتحرير السؤال بمزيد من المعلومات.

حسنًا، الرؤية من النوع مزدوج، لذلك يجب أن يعمل الربط في هذا الصدد.

كحل بديل، هل يمكنك محاولة ربط قيم ScaleX وScaleY مباشرةً بعنصر تحكم شريط التمرير الذي يرتبط به SelectedDive.Visibility؟شيء مثل:

<ScaleTransform ScaleX="{Binding ElementName=slider1,Path=Value}" ... />

إذا نجح ذلك، فسوف يساعدك ذلك على الأقل.

يحرر:آه، لقد تذكرت للتو أنني قرأت ذات مرة أن Silverlight لا يدعم بناء جملة ElementName في الارتباطات، لذلك قد لا ينجح ذلك.

نعم ربما لا ترث تحويلات العرض المضمنة DataContext من الكائن الذي تنطبق عليه.هل يمكنك فرض DataContext عليهم؟على سبيل المثال، قم بتسمية التحويل:

<ScaleTransform x:Name="myScaler" ... />

...ثم في الكود الخلفي الخاص بك:

myScaler.DataContext = fishImage.DataContext;

...بحيث يشارك المقياس بالتأكيد DataContext مع الصورة.

حسنًا، هل تلتقط الصورة نفسها DataContext بشكل صحيح؟

حاول إضافة هذا:

<Image Tooltip="{Binding SelectedDive.Visibility}" ... />

إذا تم تجميع ذلك وتشغيله، قم بالتمرير فوق الصورة ومعرفة ما إذا كانت تعرض القيمة الصحيحة.

كنت آمل أن أحل هذه المشكلة من خلال XAML، ولكن تبين أن اقتراح برايان كان هو الحل الأمثل.لقد استخدمت اقتراح مات لإعطاء اسم للمقياس، حتى أتمكن من الوصول إليه من التعليمات البرمجية.ثم قمت بربط حدث القيمة المتغيرة لشريط التمرير، وقمت يدويًا بتحديث خاصية ScaleX وScaleY.لقد احتفظت بمحول القيمة الخاص بي للتحويل من نطاق الرؤية (0-30 م) إلى مقياس (0.5 إلى 1).يبدو الرمز كما يلي:

    private ScaleConverter converter;

    public DiveLog()
    {           
        InitializeComponent();

        converter = new ScaleConverter();
        visibilitySlider.ValueChanged += new 
          RoutedPropertyChangedEventHandler<double>(visibilitySlider_ValueChanged);
    }        

    private void visibilitySlider_ValueChanged(object sender,   
                                        RoutedPropertyChangedEventArgs<double> e)
    {
        fishScale.ScaleX = (double)converter.Convert(e.NewValue, 
                                   typeof(double), null, CultureInfo.CurrentCulture);
        fishScale.ScaleY = fishScale.ScaleX;
    }
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top