我想给存在于CustomControl的Template里的事件添加处理程序(Storyboard.Completed发生的时候我想弹出一个对话框),但却发生了异常,请大家帮忙看下哪里错了,我的代码如下:
xaml代码:<ResourceDictionary
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:xClassTest"
x:Class="xClassTest.Class1"
>
<Style TargetType="{x:Type local:CustomControl1}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type local:CustomControl1}">
<Viewbox>
<Grid x:Name="TheGrid" Width="50" Height="50">
<Rectangle x:Name="TheRect" Fill="LightBlue"/>
</Grid>
</Viewbox>
<ControlTemplate.Triggers>
<EventTrigger RoutedEvent="Grid.MouseEnter" SourceName="TheGrid">
<BeginStoryboard>
<Storyboard Completed="Storyboard_Completed">
<DoubleAnimation To="100" Storyboard.TargetName="TheGrid"
Storyboard.TargetProperty="Width"/>
</Storyboard>
</BeginStoryboard>
</EventTrigger>
<EventTrigger RoutedEvent="Grid.MouseLeave" SourceName="TheGrid">
<BeginStoryboard>
<Storyboard Completed="Storyboard_Completed">
<DoubleAnimation To="50" Storyboard.TargetName="TheGrid"
Storyboard.TargetProperty="Width"/>
</Storyboard>
</BeginStoryboard>
</EventTrigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</ResourceDictionary>.cs codes:using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;namespace xClassTest
{
public class CustomControl1 : Control
{
static CustomControl1()
{
DefaultStyleKeyProperty.OverrideMetadata(typeof(CustomControl1), new FrameworkPropertyMetadata(typeof(CustomControl1)));
}
} public partial class Class1 : ResourceDictionary
{
public Class1()
{
InitializeComponent();
}
void Storyboard_Completed(object sender, EventArgs e)
{
MessageBox.Show("Completed!");
}
}
}
调用CustomControl1的代码:<Window x:Class="xClassTest.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:xClassTest"
Title="Window1" Height="300" Width="300">
<Canvas>
<local:CustomControl1/>
</Canvas>
</Window>
以上代码Build没提示错误,但是Run的时候在Window1构造函数的InitializeComponent()方法处提示:"无法重新初始化 ResourceDictionary 实例。 对象“xClassTest.Class1”行 4 位置 5 处的错误。"后来我发现,只要在CustomControl1的模板xaml文件那里的根元素添加: x:Class="xClassTest.Class1"
这一行就有这个错误提示,请问是什么问题呢?如果要实现我开始描述的要求(Storyboard Completed事件发生的时候在C#代码部分做处理)应该怎么做呢?非常感谢您的帮助。
xaml代码:<ResourceDictionary
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:xClassTest"
x:Class="xClassTest.Class1"
>
<Style TargetType="{x:Type local:CustomControl1}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type local:CustomControl1}">
<Viewbox>
<Grid x:Name="TheGrid" Width="50" Height="50">
<Rectangle x:Name="TheRect" Fill="LightBlue"/>
</Grid>
</Viewbox>
<ControlTemplate.Triggers>
<EventTrigger RoutedEvent="Grid.MouseEnter" SourceName="TheGrid">
<BeginStoryboard>
<Storyboard Completed="Storyboard_Completed">
<DoubleAnimation To="100" Storyboard.TargetName="TheGrid"
Storyboard.TargetProperty="Width"/>
</Storyboard>
</BeginStoryboard>
</EventTrigger>
<EventTrigger RoutedEvent="Grid.MouseLeave" SourceName="TheGrid">
<BeginStoryboard>
<Storyboard Completed="Storyboard_Completed">
<DoubleAnimation To="50" Storyboard.TargetName="TheGrid"
Storyboard.TargetProperty="Width"/>
</Storyboard>
</BeginStoryboard>
</EventTrigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</ResourceDictionary>.cs codes:using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;namespace xClassTest
{
public class CustomControl1 : Control
{
static CustomControl1()
{
DefaultStyleKeyProperty.OverrideMetadata(typeof(CustomControl1), new FrameworkPropertyMetadata(typeof(CustomControl1)));
}
} public partial class Class1 : ResourceDictionary
{
public Class1()
{
InitializeComponent();
}
void Storyboard_Completed(object sender, EventArgs e)
{
MessageBox.Show("Completed!");
}
}
}
调用CustomControl1的代码:<Window x:Class="xClassTest.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:xClassTest"
Title="Window1" Height="300" Width="300">
<Canvas>
<local:CustomControl1/>
</Canvas>
</Window>
以上代码Build没提示错误,但是Run的时候在Window1构造函数的InitializeComponent()方法处提示:"无法重新初始化 ResourceDictionary 实例。 对象“xClassTest.Class1”行 4 位置 5 处的错误。"后来我发现,只要在CustomControl1的模板xaml文件那里的根元素添加: x:Class="xClassTest.Class1"
这一行就有这个错误提示,请问是什么问题呢?如果要实现我开始描述的要求(Storyboard Completed事件发生的时候在C#代码部分做处理)应该怎么做呢?非常感谢您的帮助。
public partial class不太熟,是不是这个导致的啊,直接用public class行不?
,顶下
不用的话好像就是语法错误了,提示出错,说缺少partial。我也不是很清楚,也是一步一步摸索的,在网上找了很久也没答案,希望大家帮助!