0

我正在实现一个主从视图(也尝试使用 MVVM)。Master 是一个ListBox包含 5 种不同类型的项目(所有在 Master 中的格式相同)。根据在 Master 中选择的对象类型,Detail 具有不同的表单字段。我正在使用一个DataTemplateSelector,遵循这个CodeProject 教程。根据中选择的项目选择了正确的模板ListBox,但是存在一个奇怪的引用问题。

如果我从Type1master 中的一个项目转到另一个项目Type1,它们都将使用完全相同的模板。这听起来不错,但由于它是同一个引用,因此第一项中正在进行的任何动画都将显示在第二项中。如何强制单独应用模板,以便一个视图中的动画与另一个视图对模板的使用分开?

代码示例:(ContentControl呈现细节)

<ContentControl Content="{Binding Path=CVS.View.CurrentItem}">
    <ContentControl.ContentTemplate>
        <DataTemplate>
            <vms:MyTemplateSelector Content="{Binding}">
                <vms:MyTemplateSelector.Template1>
                    <DataTemplate>
                        <views:Type1View />
                    </DataTemplate>
                </vms:MyTemplateSelector.Template1>
                <vms:MyTemplateSelector.Template2>
                    <DataTemplate>
                        <views:Type2View />
                    </DataTemplate>
                </vms:MyTemplateSelector.Template2>
                <vms:MyTemplateSelector.Template3>
                    <DataTemplate>
                        <views:Type3View />
                    </DataTemplate>
                </vms:MyTemplateSelector.Template3>
                <vms:MyTemplateSelector.Template4>
                    <DataTemplate>
                        <views:Type4View />
                    </DataTemplate>
                </vms:MyTemplateSelector.Template4>
                <vms:MyTemplateSelector.Template5>
                    <DataTemplate>
                        <views:Type5View />
                    </DataTemplate>
                </vms:MyTemplateSelector.Template5>
            </vms:MyTemplateSelector>
        </DataTemplate>
    </ContentControl.ContentTemplate>
</ContentControl>

编辑- 添加动画代码

此动画代码通过作用于 SelectionChanged 事件的行为在 ComboBoxes 上执行。在运行它之前,我会检查 ComboBox 是否有焦点。此动画仅在未聚焦时才会发生,作为必须修改其先前选择的视觉提示。

public void AnimateComboBox(ComboBox cbo)
{
    LinearGradientBrush myBrush = new LinearGradientBrush();
    myBrush = Extensions.Clone<LinearGradientBrush>(cbo.BorderBrush as LinearGradientBrush);
    cbo.BorderBrush = myBrush;

    Storyboard sb = new Storyboard();
    sb.Duration = new Duration(TimeSpan.FromMilliseconds(3000));

    foreach(GradientStop s in myBrush.GradientStops)
    {
        ColorAnimation anim = new ColorAnimation();
        anim.To = Colors.Red;
        anim.Duration = new Duration(TimeSpan.FromSeconds(0.5));
        anim.AutoReverse = true;
        anim.RepeatBehavior = RepeatBehavior.Forever;

        Storyboard.SetTarget(anim, s);
        Storyboard.SetTargetProperty(anim, new PropertyPath(GradientStop.ColorProperty));

        sb.Children.Add(anim);
    }

    sb.Begin();
}

Extensions.Clone 来自Silverlight 论坛

4

0 回答 0