WPF مشغلات تؤثر على القيم المحددة في التعليمات البرمجية، وليس XAML

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

  •  12-09-2019
  •  | 
  •  

سؤال

في تطبيقي، لدي تبديل الأزرار التي لها ثلاث حالات ممكنة؛ "غير مرفق"، "فحص"، و "المستخدمة سابقا". عندما يتعلق الأمر بهذه الشاشة هذه، ستكون بعض أزرار التبديل في الحالة "المستخدمة مسبقا" لإظهار العمل الذي تم القيام به. سيضع النقر فوق زر تبديل (بغض النظر عن الحالة الحالية) في حالة "فحص". يمكن التحقق من واحد فقط من أزرار تبديل هذه في وقت واحد. يشار إلى الدول المختلفة من خلال توهج خارجي مختلفي أو لا توهج على الإطلاق.

لتعيين الوهج الخارجي للحالة "تم التحقق منها"، أستخدم الزناد على 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, ، أنت تحدد القيمة المحلية لل ButtonEffect الممتلكات، التي DependencyProperty (Button.EffectProperty). تتجاوز القيمة المحلية أي قيمة أخرى محتملة حتى يتم مسحها مثل هذا:

button1.ClearValue( Button.EffectProperty );

ومع ذلك، فإن هذا فقط يجعل الأعمال أكثر توافقا قليلا، لأنك تضطر أيضا إلى التأكد من مسحها إذا تم تعيينها من قبل ولم يتم مسحها بعد.

بدلا من ذلك، يمكنك إنشاء ملحق PreviouslyUsed لوضع على ToggleButtonS واستخدام Bindings حتى يحصلون على قيمتهم أكثر قليلا من السيارات. ثم الرجوع إلى قيمة المرفق هذه في المشغلات الخاصة بك وستحصل على ظل قطرة واحدة ل PreviouslyUsed, ، وآخر ل IsChecked.

الجزء الذي سيتعين عليك أن يربطه هو الربط، وربما عليك استخدام IValueConverter في مكان ما لتحويل mViews[i].LocalizedName الى true أو false بالنسبة PreviouslyUsed.

لسوء الحظ، لا أعرف ما يكفي عن الإعداد الخاص بك مع mViews وتقديم المزيد من النصائح حول ذلك. أنا لا أعرف ما إذا كان لديك ToggleButtons هي جزء من Databinding أم لا. أظن أنهم ليسوا كذلك، كما يبدو أنك تكرار مجموعة منهم. إذا كنت ملزمة الخاص بك mViews أشياء إلى ItemsSource من أ ListBox, ، على سبيل المثال، يمكنك إنشاء DataTemplate الذي يولد ToggleButtons مع المرفقات في مكان بالفعل. من شأنها أيضا تبسيط الخاص بك IsChecked الوضع عن طريق ربطه ما إذا كان هذا البند المحدد أم لا في ListBox, ، ثم ListBox يعتني بالتأكد من اختيار واحد فقط.

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