سؤال

ولقد خلق خاصية التبعية المرفقة لالقصص المصورة، بقصد تمكين لي لاستدعاء أسلوب على بلدي ViewModel عندما القصة المصورة المنجز وقع الحدث:

public static class StoryboardExtensions
{
    public static ICommand GetCompletedCommand(DependencyObject target)
    {
        return (ICommand)target.GetValue(CompletedCommandProperty);
    }

    public static void SetCompletedCommand(DependencyObject target, ICommand value)
    {
        target.SetValue(CompletedCommandProperty, value);
    }

    public static readonly DependencyProperty CompletedCommandProperty =
        DependencyProperty.RegisterAttached(
            "CompletedCommand",
            typeof(ICommand),
            typeof(StoryboardExtensions),
            new FrameworkPropertyMetadata(null, OnCompletedCommandChanged));

    static void OnCompletedCommandChanged(DependencyObject target, DependencyPropertyChangedEventArgs e)
    {
        Storyboard storyboard = target as Storyboard;
        if (storyboard == null) throw new InvalidOperationException("This behavior can be attached to Storyboard item only.");
        storyboard.Completed += new EventHandler(OnStoryboardCompleted);
    }

    static void OnStoryboardCompleted(object sender, EventArgs e)
    {                        
        Storyboard item = ... // snip
        ICommand command = GetCompletedCommand(item);
        command.Execute(null);
    }
}

وبعد ذلك محاولة استخدامه في XAML، مع تركيب التجليد:

<Grid>
    <Grid.Resources>
        <Storyboard x:Key="myStoryboard" my:StoryboardExtensions.CompletedCommand="{Binding AnimationCompleted}">
            <DoubleAnimation Storyboard.TargetProperty="Opacity" From="1" To="0" Duration="0:0:5" />
        </Storyboard>

        <Style x:Key="myStyle" TargetType="{x:Type Label}">
            <Style.Triggers>
                <DataTrigger 
                 Binding="{Binding Path=QuestionState}" Value="Correct">
                    <DataTrigger.EnterActions>
                        <BeginStoryboard Storyboard="{StaticResource myStoryboard}" />
                    </DataTrigger.EnterActions>
                </DataTrigger>
            </Style.Triggers>
        </Style>

    </Grid.Resources>
    <Label x:Name="labelHello" Grid.Row="0" Style="{StaticResource myStyle}">Hello</Label>
</Grid>

وهذا فشل مع الاستثناء التالي:

<اقتباس فقرة>   

وقعت System.Windows.Markup.XamlParseException   . رسالة = "لا يمكن تحويل قيمة في السمة 'ستايل' إلى كائن من النوع 'System.Windows.Style' لا يمكن تجميد هذه الشجرة زمني القصة المصورة للاستخدام في جميع أنحاء المواضيع خطأ في الكائن 'labelHello' في ملف الترميز" TestWpfApp؛ المكون / window1 .xaml '

هل هناك أي طريقة للحصول على بناء الجملة ملزم بالعمل مع خاصية ICommand تعلق لوحة العمل؟

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

المحلول 3

لتحصل تغلب على هذه المشكلة، أنا خلق مجموعة من الخصائص المرفقة، ودعا القصة المصورة المساعدون (<لأ href = "http://learninggames.codeplex.com/SourceControl/changeset/view/30938#661240" يختلط = "نوفولو noreferrer "> شفرة المصدر هنا ). تخليت عن محاولة لضمها إلى لوحة العمل نفسه، والآن نعلق على أي (التعسفي) عنصر الإطار إلى استدعاء ICommand على بلدي ViewModel عند اكتمال القصة المصورة، وكذلك ملزمة لحدث معين على ViewModel بلدي لإطلاق القصة المصورة . تحدد خاصية إرفاق الثالثة على القصة المصورة التي نتعامل معها:

<FrameworkElement
   my:StoryboardHelpers.Storyboard="{StaticResource rightAnswerAnimation}"
   my:StoryboardHelpers.Completed="{Binding CompletedCommand}"
   my:StoryboardHelpers.BeginEvent="{Binding StartCorrectAnswer}" />

نصائح أخرى

وهذا شيء حسب التصميم. إذا كان لديك كائن freezable التي وضعت في الاسلوب، وسوف يتم تجميد النمط للسماح بالوصول عبر الموضوع. ولكنك ملزم هو في الأساس تعبير وهو ما يعني أنه لا يمكن مجمدة في ربط البيانات غير مترابطة واحد.

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

والجواب الكامل على المنتديات الاجتماعية MSDN هو <وأ href = "http://social.msdn.microsoft.com/forums/en-US/wpf/thread/8e97d92b-42cf-462e-b8d0-6d8b6bcb357a/" يختلط = "نوفولو noreferrer"> هنا .

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

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