WPF مشغلات تؤثر على القيم المحددة في التعليمات البرمجية، وليس XAML
سؤال
في تطبيقي، لدي تبديل الأزرار التي لها ثلاث حالات ممكنة؛ "غير مرفق"، "فحص"، و "المستخدمة سابقا". عندما يتعلق الأمر بهذه الشاشة هذه، ستكون بعض أزرار التبديل في الحالة "المستخدمة مسبقا" لإظهار العمل الذي تم القيام به. سيضع النقر فوق زر تبديل (بغض النظر عن الحالة الحالية) في حالة "فحص". يمكن التحقق من واحد فقط من أزرار تبديل هذه في وقت واحد. يشار إلى الدول المختلفة من خلال توهج خارجي مختلفي أو لا توهج على الإطلاق.
لتعيين الوهج الخارجي للحالة "تم التحقق منها"، أستخدم الزناد على euqals ischecked True.
<ControlTemplate.Triggers>
<Trigger Property="IsChecked" Value="True">
<Setter Property="Effect">
<Setter.Value>
<DropShadowEffect Color="Salmon" BlurRadius="40" ShadowDepth="0" Opacity="1.0"></DropShadowEffect>
</Setter.Value>
</Setter>
</Trigger>
</ControlTemplate.Triggers>
بالنسبة للدولة "المستخدمة سابقا"، أقيم الوهج الخارجي في التعليمات البرمجية، وليس العلامات. يجب أن أقوم بذلك لأن تحديد ما إذا كان يجب أن يكون الزر في هذه الحالة عن طريق التحقق من القيم في قائمة.
if (mExistingViews.Contains(mViews[i].LocalizedName))
{
DropShadowEffect dse = new DropShadowEffect();
dse.ShadowDepth = 0;
dse.BlurRadius = 20;
dse.Opacity = 1.0;
dse.Color = Colors.Yellow;
mViewButtons[i].Effect = dse;
}
ومع ذلك، عند النقر فوق زر التبديل عندما يكون في الحالة "المستخدمة مسبقا"، لا يبدو أن الزناد لديه أي تأثير. الوهج الخارجي لا يتغير.
ما الخطأ الذي افعله؟ هل لا يؤثر الزناد شيئا لم يتم تعيينه في XAML؟
المحلول
بمجرد ضبط DropShadowEffect
على ال Button
, ، أنت تحدد القيمة المحلية لل Button
'س Effect
الممتلكات، التي DependencyProperty
(Button.EffectProperty
). تتجاوز القيمة المحلية أي قيمة أخرى محتملة حتى يتم مسحها مثل هذا:
button1.ClearValue( Button.EffectProperty );
ومع ذلك، فإن هذا فقط يجعل الأعمال أكثر توافقا قليلا، لأنك تضطر أيضا إلى التأكد من مسحها إذا تم تعيينها من قبل ولم يتم مسحها بعد.
بدلا من ذلك، يمكنك إنشاء ملحق PreviouslyUsed
لوضع على ToggleButton
S واستخدام Bindings
حتى يحصلون على قيمتهم أكثر قليلا من السيارات. ثم الرجوع إلى قيمة المرفق هذه في المشغلات الخاصة بك وستحصل على ظل قطرة واحدة ل PreviouslyUsed
, ، وآخر ل IsChecked
.
الجزء الذي سيتعين عليك أن يربطه هو الربط، وربما عليك استخدام IValueConverter
في مكان ما لتحويل mViews[i].LocalizedName
الى true
أو false
بالنسبة PreviouslyUsed
.
لسوء الحظ، لا أعرف ما يكفي عن الإعداد الخاص بك مع mViews
وتقديم المزيد من النصائح حول ذلك. أنا لا أعرف ما إذا كان لديك ToggleButtons
هي جزء من Databinding أم لا. أظن أنهم ليسوا كذلك، كما يبدو أنك تكرار مجموعة منهم. إذا كنت ملزمة الخاص بك mViews
أشياء إلى ItemsSource
من أ ListBox
, ، على سبيل المثال، يمكنك إنشاء DataTemplate
الذي يولد ToggleButtons
مع المرفقات في مكان بالفعل. من شأنها أيضا تبسيط الخاص بك IsChecked
الوضع عن طريق ربطه ما إذا كان هذا البند المحدد أم لا في ListBox
, ، ثم ListBox
يعتني بالتأكد من اختيار واحد فقط.