Вот настройки:
У меня есть библиотека элементов управления Silverlight "Controls", в которой для представления диалогов определен пользовательский элемент управления:
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>
Я использую этот диалог во многих местах без проблем. Тем не менее, в одном приложении, вложенном примерно в 3-4 пользовательских элемента управления из RootVisual, я использую его следующим образом:
<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()
для родителя UserControl
вышеупомянутого XAML.
Если быть точным, это происходит прямо здесь:
this.AddUpdateDialog = ((hookitupright.com.silverlight.controls.general.Dialog)(this.FindName("AddUpdateDialog")));
Когда я ставлю точку останова, большую часть времени FindName возвращает типизированный объект Dialog, но иногда он возвращает ContentControl (основа для Dialog), и это не удается. XAML не изменился. Это статично ... Поскольку исключение является прерывистым и возникает в сгенерированном коде, я в растерянности.
Я пробовал:
- Переместил весь контент для диалога в отдельный UserControl - казалось, только усугубил проблему
Закомментируйте части и посмотрите, когда это работает ... хорошо, если я полностью закомментирую TextBox, он больше не будет работать. Все остальное (включая прикрепленное свойство пользовательской проверки), похоже, никак не влияет.
2a. Думая, что это может быть связано с привязкой TwoWay к TextBox, я удалил привязку. По-прежнему не удается.
ОБНОВЛЕНИЕ: Поэтому, учитывая (2) выше, я оставил текстовое поле закомментированным, решил перейти к другим вещам и вернуться к этому с надеждой, что что-то откроется мне. К сожалению, он также не работает с Textbox, только реже.
Кроме того, у меня есть этот элемент управления в точно такой же конфигурации в другом пользовательском контроле в том же приложении (и на том же уровне в VisualTree), и он не выходит из строя вообще. Поэтому я буквально скопировал и вставил неисправный XAML в Main.xaml (мой корневой визуал) и, конечно же, он тоже не потерпит неудачу. Предполагая, что XAML загружен в последовательности (сверху вниз), неисправный элемент управления, вероятно, является одним из последних загруженных. Моя единственная гипотеза сейчас заключается в том, что есть некоторая временная вещь, которая происходит, когда Iam все еще загружает визуальное дерево, я начинаю получать * Завершенные события при загрузке данных через службу WCF, и что они вызывают макет до того, как визуальное дерево будет полностью загружен, что вызывает некоторые побочные эффекты ... Я проверю это.
Проблема в том, что он НЕ терпит неудачу каждый раз. Это взрывается примерно в 20% случаев. Когда это работает, все работает, даже этот диалог?
Эта проблема связана, если не с той же проблемой: когда я «исправляю» инвалидность, закомментировав необходимую функциональность, я гораздо реже, но периодически получаю этот недействительный атрибут (когда атрибут / свойство на самом деле есть).