كيف يمكنني الحصول على WPF EventTrigger على مشغل العرض عندما يملي نموذج العرض الأساسي ذلك؟

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

  •  07-07-2019
  •  | 
  •  

سؤال

وهنا السيناريو:

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

<UserControl x:Class="View.UnitView"  ... >
   ...
    <Storyboard x:Key="ActivateGlow">
       ...
    </Storyboard>
    ...
    <!-- INVALID BINDING! Not Dependancy Object-->
    <EventTrigger RoutedEvent="{Binding OnActivateGlow}"> 
       <BeginStoryboard Storyboard="{StaticResource ActivateGlow}"/>
    </EventTrigger>
</UserControl>

في الكود الخلفي لـ UnitView، لدي:

public event EventHandler ActivateGlow;

وكما هو طبيعي جدًا في MVVM، لدي DataTemplate التالي لـ UnitViewModel:

<DataTemplate DataType="{x:Type vm:UnitViewModel}">
    <vw:UnitView d:DesignWidth="150" d:DesignHeight="100" />
</DataTemplate>

السؤال النهائي هو، كيف يمكنني إعداد شيء ما حتى يتمكن نموذج العرض من إطلاق حدث OnActivateGlow؟

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

المحلول

تحديث:فيروسو، كما هو مذكور في التعليقات، يجب أن تكون قادرًا على (أعتقد - أي.لم يتم اختباره) تكون قادرًا على استخدام مكونات سلوك المزج لتغطية متطلباتك.

بالإضافة إلى تنزيل وتثبيت SDK.احصل على نسخة من مكتبة نماذج مزيج التعبير (ستحتاج إلى النقر فوق التنزيلات من الرابط التالي):عينات مزيج التعبير

تحتوي هذه المكتبة على مشغل تم إنشاؤه مسبقًا يسمى "DataEventTrigger" والذي يمكنك استخدامه لتشغيل الإجراءات استجابةً لحدث تم الإعلان عنه في نموذج العرض الخاص بك.

يحتوي مزيج SDK بالفعل (حسب ما يمكنني قوله) على الجزء الآخر من اللغز - فهو يتضمن بالفعل إجراءً يسمح لك بالتحكم في القصص المصورة.اسم هذا الإجراء هو "ControlStoryboardAction".

يجب أن ينتهي بك الأمر مع بعض xaml الذي يبدو كما يلي:

    <i:Interaction.Triggers>
        <samples:DataEventTrigger EventName="YourEvent">
            <im:ControlStoryboardAction Storyboard="{StaticResource Storyboard1}" 
                   ControlStoryboardOption="Play"/>
        </samples:DataEventTrigger>
    </i:Interaction.Triggers>

استبدل "YourEvent" باسم الحدث الذي حددته في نموذج العرض الخاص بك، واستبدل "Storyboard1" باسم لوحة العمل الخاصة بك.بالطبع يجب أن تتطابق الأسماء تمامًا.

فيما يلي تعريفات مساحة اسم xaml المستخدمة:

xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity" 
xmlns:im="clr-namespace:Microsoft.Expression.Interactivity.Media;assembly=Microsoft.Expression.Interactions"
xmlns:samples="clr-namespace:Expression.Samples.Interactivity;assembly=Expression.Samples.Interactivity"

المشاركة الأصلية قبل التعديل:

أقترح عليك إلقاء نظرة على سلوكيات مزيج التعبير:

معلومة

مزيج SDK

فيديو عن السلوكيات

نصائح أخرى

ويمكنك أيضا وضع خاصية IsGlowing منطقية على viewmodel واستخدام datatriggers في طريقتك

<Rectangle.Style>  
    <Style TargetType="{x:Type Rectangle}">  
        <Style.Triggers>  
            <DataTrigger Binding="{Binding Path=IsGlowing}" Value="True">  
                <DataTrigger.EnterActions>  
                    <BeginStoryboard>  
                        <Storyboard>  
                            ...  
                        </Storyboard>  
                    </BeginStoryboard>  
                </DataTrigger.EnterActions>  
            </DataTrigger>  
        </Style.Triggers>  
    </Style>  
</Rectangle.Style>  

أعتقد أنه سيتعين عليك الارتباط بـ أ RoutedEvent على سبيل المثال، وليس حدث CLR.

لم أحاول ذلك، ولكن شيء من هذا القبيل يجب أن يعمل:

public class UnitView
{
    public static readonly RoutedEvent ActivateGlowEvent
        = EventManager.RegisterRoutedEvent(
              "ActivateGlow", RoutingStrategy.Bubble,
              typeof(RoutedEventHandler), typeof(UnitView)
          );

    public void RaiseActivateGlowEvent()
    {
        RaiseEvent(new RoutedEventArgs(ActivateGlowEvent));
    }
}

وطريقة واحدة وجدت لحل هذه هي استخدام مشغل البيانات على DataTemplate التي تحتوي على عنصر التحكم المذكورة أعلاه ... ربما لا يكون أفضل طريقة للقيام بذلك ولكن. ما زلت منفتح على أفكار أفضل.

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