WPF لماذا يتم تجميد scaletransform الخاص بي وكيف يمكنني ربطها؟

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

سؤال

لديّ عنصر تحكم مستخدم بسيط جدًا أريد ربط أ ScaleTransform خاصية إلى موانئ دبي في الكود وراء ذلك:

<UserControl 
x:Name="RoundByRound"
DataContext="{Binding RelativeSource={RelativeSource Self}}"
...
>

<Canvas x:Name="MyCanvas">
  <Canvas.RenderTransform>
    <TransformGroup>
      <ScaleTransform ScaleX="{Binding ZoomTransform.ScaleX, ElementName=RoundByRound}" 
                      ScaleY="{Binding ZoomTransform.ScaleY, ElementName=RoundByRound}"/>
      <SkewTransform/>
      <RotateTransform/>
      <TranslateTransform X="{Binding TranslateTransform.X, ElementName=RoundByRound}" 
                          Y="{Binding TranslateTransform.Y, ElementName=RoundByRound}"/>
     </TransformGroup>
   </Canvas.RenderTransform>
</Canvas>
</UserControl>

ثم في الكود وراء أنا أفعل هذا:

ZoomTransform.ScaleX = 3;
ZoomTransform.ScaleY = 3;

لكنني حصلت على خطأ في قول:

لا يمكن تعيين خاصية على كائن "..." لأنها في حالة قراءة فقط.

لذلك قمت بتغييره إلى:

var cloned = ZoomTransform.Clone();
cloned.ScaleX = 3;
cloned.ScaleY = 3;
ZoomTransform = cloned;

ولكن الآن هذا في الواقع لا يفعل شيئًا ... لا يتم تطبيق أي مقياس على قماش بلدي.

ومع ذلك

إذا قمت بإزالة الربط على ScaleTransform وحصل عليه كعنصر XAML فارغ:

<ScaleTransform />

ثم في الكود الخاص بي أفعل هذا:

(MyCanvas.RenderTransform as TransformGroup).Children[0] = new ScaleTransform(3, 3);

إنها تعمل! أحصل على المقياس المطبق

لذلك 2 أسئلة:

  1. لماذا تحويلي Frozen هو المكان الأول؟
  2. لماذا لا عملي الرابط عندما أقوم بتحويل؟

شكرا لكم جميعا!

تحديث:

هنا هو تعريف موانئ دبي:

public static readonly DependencyProperty TranslateTransformProperty = DependencyProperty.Register("TranslateTransform",
            typeof(TranslateTransform),
            typeof(RoundByRoundControl),
            new PropertyMetadata(new TranslateTransform { X = 0, Y = 0 }));

        public static readonly DependencyProperty ZoomTransformProperty = DependencyProperty.Register("ZoomTransform",
            typeof(ScaleTransform),
            typeof(RoundByRoundControl),
            new PropertyMetadata(new ScaleTransform { ScaleX = 1, ScaleY = 1 }));

        public TranslateTransform TranslateTransform
        {
            get { return (TranslateTransform)GetValue(TranslateTransformProperty); }
            set { SetValue(TranslateTransformProperty, value); }
        }

        public ScaleTransform ZoomTransform
        {
            get { return (ScaleTransform)GetValue(ZoomTransformProperty); }
            set { SetValue(ZoomTransformProperty, value); }
        }
هل كانت مفيدة؟

المحلول

يتم تجميد الناقضات المقيسة التي تمريرها كقيمة افتراضية لخاصية ZoomTransform بواسطة PropertyMetadata. بمجرد أن يكون propertymetadata انتقل إلى طريقة التسجيل سيتم تجميدها/مختومة.

ومع ذلك ، بمجرد استهلاك البيانات الوصفية كجزء من مكالمة للتسجيل أو الملحق أو التجاوز ، سيختم نظام الممتلكات أن مثيل البيانات الوصفية ويعتبر العقارات الآن غير قابلة للتغيير. إن محاولة تعيين DefaultValue بمجرد إصدارها صحيحة على مثيل البيانات الوصفية هذه ستثير استثناء.

نظرًا لأن scaletransform قابلة للتجميد ، يتم تجميدها كجزء من هذه العملية.

بالنسبة إلى السؤال الثاني لك ، استنادًا إلى الكود الذي قدمته ، فإنه يطبق بشكل صحيح scaletransform عند استنساخ Zoomtransform. يجب أن يكون هناك شيء آخر يحدث لم تتضمنه.

هذا يفترض أن XAML لـ USERCONTROL تتضمن سمة X: CLASS التي تربط ملف الكود behind لـ RoundByRoundControl.

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