سؤال

لدي عنصر موجود وهو طفل من قماش. يتم احتواء نمط العنصر في قاموس موردي يحتوي على فرش مختلفة يمكن استخدامها لتلوين العنصر.

عند إنشاء مثيل للعنصر، يتم إعطاء التلوين الافتراضي. أنا غير قادر حاليا على التفاعل مباشرة مع ملء ملء كما في:

item.Fill = BrushBlue;

لهذا السبب بدأت في النظر إلى XAML لكل مثيل العنصر.

XAML أنا مهتم بالعنصر بعد إنشاء مثيل هو:

<d:Item IsSelected="True" Width="78" Height="65" Panel.ZIndex="0" Canvas.Left="233"     Canvas.Top="352.54">
    <Path ToolTip="Process">
        <Path.Style>
             <Style TargetType="Path">
                 <Style.BasedOn>
                     <Style TargetType="Path">
                         <Style.Resources>
                            <ResourceDictionary />
                         </Style.Resources>
                         <Setter Property="Shape.Fill">
                             <Setter.Value>
                                 <DynamicResource ResourceKey="ItemBrush" />
                             </Setter.Value>
                         </Setter>
                     </Style>
                 </Style.BasedOn>
             </Style>
        </Path.Style>
    </Path>
.
.
.
</d:Item>

أود بشكل مثالي أن أكون قادرا على ربط الشكل. قيمة ملكية إلى خاصية مثيل العنصر، أو على الأقل أن أكون قادرا على تغيير هذه القيمة بناء على اختيار المستخدم في التطبيق.

أنا تحرير XAML من العنصر لتغيير لون التعبئة. لإنجاز هذا أنا أستخدم التعليمات البرمجية التالية، بناء على نموذج استنساخ الزر من MSDN:

string savedItem = XamlWriter.Save(this) as String;

string newItem = savedItem.Replace(GetFillBrush(this), "BrushBlue");
SetFillBrush(this, "BrushBlue");

StringReader stringReader = new StringReader(newItem);
XmlReader xmlReader = XmlReader.Create(stringReader);

thisCanvas.Children.Add((Item)XamlReader.Load(xmlReader));

أحصل على XAML وتحديث اسم موارد الفرشاة ثم إنشاء عنصر جديد.

كان هذا النهج دليلا على المفهوم. أريد أن أكون قادرا على تحديث XAML من العنصر الموجود دون الحاجة إلى إنشاء عنصر جديد على قماش.

ما هي أفضل طريقة لإنجاز هذا التحديث "الوارد" لهذا خاصية ملء العنصر؟

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

المحلول

أفترض أن الفرشاة تستخدم في أكثر من مكان واحد، ولهذا السبب لا يمكنك ضبط خاصية التعبئة فقط:

item.Fill = Brushes.Blue;

في هذه الحالة، يجب أن تقوم بتغليف العنصر في UserControl أو عنصر تحكم مخصص، مع خاصية التبعية من النوع Brush. (اعتمادا على استخدام الفرشاة، قد تتصل أيضا بملء هذه الملء، أو قد يكون أكثر تحديدا، مثل أكسيدفايد أو outerberderfill، وما إلى ذلك) ثم في XAML، قم بربط كل هذه الأحداث المتعددة من الفرشاة إلى هذه الخاصية. الآن أنت فعل احصل على مكان واحد حيث يمكنك ضبط العقار، ومن خلال الارتباطات، فسوف تنتشر جميع الأماكن التي يحتاجها:

item.AccentFill = Brushes.Blue;

في أي حال، فإن الشيء الرئيسي لا يفكر في "تحديث XAML من العنصر الموجود". XAML هو تنسيق التسلسل. عنصرك الحالي هو بالفعل كائن .NET في الذاكرة ويمكنك ضبط خصائصه مباشرة بدلا من الحاجة إلى إعادة التحميل من نموذج متسلسل.

نصائح أخرى

ما لم أسيء فهم سؤالك، أنت حقا القيام بذلك بالطريقة الصعبة. لماذا لا يعمل هذا؟

this.Fill = Brushes.Blue;

أو إذا كان من المهم استخدام اسم مورد:

this.Fill = (Brush)FindResource("BlueBrush")

ربما تحتاج إلى توضيح سؤالك لشرح سبب عدم قدرتك على ضبط القيمة ويتم القيام به معها.

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