下面是设置:间歇InavlidCastException在UserControl.InitializeComponent()
我有一个Silverlight控件库“控件”,其中我具有用于呈现的对话框中定义的客户控制:
public class Dialog : ContentControl
{
public Dialog()
: base()
{
DefaultStyleKey = typeof(Dialog);
}
<...normal custom control stuff...>
}
也默认样式在generic.xaml:
<Style TargetType="src_general:Dialog">
<Setter Property="Padding" Value="25"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="src_general:Dialog">
<Grid x:Name="RootElement" >
<vsm:VisualStateManager.VisualStateGroups>
<vsm:VisualStateGroup x:Name="DiakogStyleStates">
<vsm:VisualState x:Name="OkCancel">
<Storyboard>
</Storyboard>
</vsm:VisualState>
<vsm:VisualState x:Name="OkOnly">
<Storyboard>
<ObjectAnimationUsingKeyFrames Duration="0:0:0" Storyboard.TargetName="CancelButton" Storyboard.TargetProperty="Visibility" >
<DiscreteObjectKeyFrame KeyTime="0:0:0" >
<DiscreteObjectKeyFrame.Value>
<Visibility>Collapsed</Visibility>
</DiscreteObjectKeyFrame.Value>
</DiscreteObjectKeyFrame>
</ObjectAnimationUsingKeyFrames>
</Storyboard>
</vsm:VisualState>
<vsm:VisualState x:Name="CancelOnly">
<Storyboard>
<ObjectAnimationUsingKeyFrames Duration="0:0:0" Storyboard.TargetName="OkButton" Storyboard.TargetProperty="Visibility" >
<DiscreteObjectKeyFrame KeyTime="0:0:0" >
<DiscreteObjectKeyFrame.Value>
<Visibility>Collapsed</Visibility>
</DiscreteObjectKeyFrame.Value>
</DiscreteObjectKeyFrame>
</ObjectAnimationUsingKeyFrames>
</Storyboard>
</vsm:VisualState>
<vsm:VisualState x:Name="None">
<Storyboard>
<ObjectAnimationUsingKeyFrames Duration="0:0:0" Storyboard.TargetName="CancelButton" Storyboard.TargetProperty="Visibility" >
<DiscreteObjectKeyFrame KeyTime="0:0:0" >
<DiscreteObjectKeyFrame.Value>
<Visibility>Collapsed</Visibility>
</DiscreteObjectKeyFrame.Value>
</DiscreteObjectKeyFrame>
</ObjectAnimationUsingKeyFrames>
<ObjectAnimationUsingKeyFrames Duration="0:0:0" Storyboard.TargetName="OkButton" Storyboard.TargetProperty="Visibility" >
<DiscreteObjectKeyFrame KeyTime="0:0:0" >
<DiscreteObjectKeyFrame.Value>
<Visibility>Collapsed</Visibility>
</DiscreteObjectKeyFrame.Value>
</DiscreteObjectKeyFrame>
</ObjectAnimationUsingKeyFrames>
</Storyboard>
</vsm:VisualState>
</vsm:VisualStateGroup>
</vsm:VisualStateManager.VisualStateGroups>
<Popup x:Name="DialogPopup">
<src_general:WindowFrame x:Name="Frame">
<Grid >
<Grid.RowDefinitions>
<RowDefinition Height="*" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<ContentPresenter Grid.Row="0" x:Name="ContentPresenter" Margin="{TemplateBinding Padding}"/>
<!--Action Buttons-->
<StackPanel Grid.Row="1" Orientation="Horizontal" HorizontalAlignment="Right" Margin="15">
<src_general:GlassButton x:Name="CancelButton" Content="Cancel" Margin="2"/>
<src_general:GlassButton x:Name="OkButton" Content="Ok" Margin="2"/>
</StackPanel>
</Grid>
</src_general:WindowFrame>
</Popup>
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
我在很多地方使用这个对话框没有问题。然而,在一个应用程序,从RootVisual嵌套约3-4用户控件,我用它的方式如下:
<general:Dialog x:Name="AddUpdateDialog" DialogStyle="OkCancel" Title="Add/Update Connection" Closed="AddUpdateDialog_Closed" ValidationGroup="AddConnection">
<Grid Width="300">
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="10"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<TextBlock Grid.Row="0" Grid.Column="0" Text="Name:" Style="{StaticResource LabelText}"/>
<TextBox Grid.Row="0" Grid.Column="2" Text="{Binding Name, Mode=TwoWay}" Style="{StaticResource TextBoxInput}" MaxLength="49">
<val:ValidationManager.Validator>
<val:RequiredValidator ManagerName="AddConnection" ErrorMessage="Name is required."/>
</val:ValidationManager.Validator>
</TextBox>
</Grid>
</general:Dialog>
当我运行这个程序,我间歇性(约每5-10开始出现以下情况例外:
“无法投System.Windows.Controls.ContentControl
类型的对象键入hookitupright.com.silverlight.controls.general.Dialog
”。发生在InitializeComponent()
用于上述XAML的父UserControl
具体而言,它在这里发生:
this.AddUpdateDialog = ((hookitupright.com.silverlight.controls.general.Dialog)(this.FindName("AddUpdateDialog")));
当我在那里放置一个断点时,大多数时候FindName都返回一个Dialog类型的对象,但有时它返回一个ContentControl(对话框的基础)并失败。 XAML没有改变。它是静态的...由于异常是间歇性的,发生在生成的代码中,所以我不知所措。
我曾尝试:
- 感动了所有的对话内容到一个单独的用户控件 - 似乎只是使问题变得更糟
注释掉的部分,看看它工作时......好,如果我完全注释掉TextBox,它不会再失败。其他一切(包括自定义验证附加属性)似乎都没有影响。
2a。认为它可能与TwoWay绑定到TextBox有关,我删除了绑定。仍然失败。
更新:因此,考虑上述(2)我离开了文本框注释掉决定转移到其他的事情,回来这与希望,事情会自己透露给我。不幸的是,它似乎也失败了文本框,只是不太经常。
此外,我在同一个应用程序中的另一个用户控件中(和VisualTree中的同一级别)具有完全相同的配置,并且它完全不会失败。所以我从字面上复制并将失败的XAML粘贴到Main.xaml(我的根视觉)中,当然,它也不会在那里失败。假设XAML按顺序(从上到下)加载,失败的控件可能是最后一个加载的控件。我现在唯一的假设是,有一些计时事件正在发生,即Iam仍然加载可视化树,我开始通过WCF服务加载数据来获得完成的事件,并且这些事件在可视化树之前触发布局满载导致一些不良副作用...我会测试这个。
问题是,它不会每次都失败。它大约有20%的时间爆炸。当它工作时,甚至这个对话框都可以工作
如果不是相同的问题,这个问题是相关的:当我通过注释掉需要的功能来“修复”无效播放时,我会不太频繁但是间歇性地得到this无效属性(当属性/属性实际上存在时)。
什么是最令人费解的是,我无法找出将使FindName在生成的代码返回的的对象基本类型ContentControl间歇性地。 – caryden 2009-01-22 21:49:00