我有一个有趣的问题。我创建了一个WPF UserControl,它包含一个使用模板的按钮:
<Button x:Name="btnStart" Template="{StaticResource RoundedGlassButton}" HorizontalAlignment="Right" VerticalAlignment="Top" Margin="4" Height="32" Background="DarkGreen" Foreground="White" Width="72" Content="Start" />
当我将UserControl放在父控件或窗体上时,设计器会抛出错误,“无法创建类型'MyUserControl'的实例。”然而,设计师无法工作,应用程序仍将编译,我在运行时获得所需的结果。我已将问题缩小到应用于我的按钮的模板。当我删除模板时,设计师会工作:
<Button x:Name="btnStart" HorizontalAlignment="Right" VerticalAlignment="Top" Margin="4" Height="32" Background="DarkGreen" Foreground="White" Width="72" Content="Start" />
我在整个地方使用这个特定的模板 - 所以我知道它有效。它甚至适用于其他UserControls。我只是无法理解为什么它在这个特定的UserControl中不起作用。
有人有什么想法吗?如果没有能够在可视化设计器中看到结果,那么很难构建UI。
以下是模板的标记。然而,就像我说的那样,我在整个地方使用它没有任何问题。事实上,我甚至在其他UserControls中使用它就好了。我很难过为什么它不能用于这个特定的代码。
<ControlTemplate x:Key="RoundedGlassButton" TargetType="{x:Type Button}">
<ControlTemplate.Resources>
<Storyboard x:Key="Timeline1">
<DoubleAnimationUsingKeyFrames BeginTime="00:00:00" Storyboard.TargetName="glow" Storyboard.TargetProperty="(UIElement.Opacity)">
<SplineDoubleKeyFrame KeyTime="00:00:00.3000000" Value="1"/>
</DoubleAnimationUsingKeyFrames>
</Storyboard>
<Storyboard x:Key="Timeline2">
<DoubleAnimationUsingKeyFrames BeginTime="00:00:00" Storyboard.TargetName="glow" Storyboard.TargetProperty="(UIElement.Opacity)">
<SplineDoubleKeyFrame KeyTime="00:00:00.3000000" Value="0"/>
</DoubleAnimationUsingKeyFrames>
</Storyboard>
</ControlTemplate.Resources>
<Border BorderBrush="#FF888888" BorderThickness="1,1,1,1" CornerRadius="4">
<Border x:Name="border" Background="{TemplateBinding Background}" BorderBrush="#FF000000" BorderThickness="1,1,1,1" CornerRadius="4">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="0.507*"/>
<RowDefinition Height="0.493*"/>
</Grid.RowDefinitions>
<Border Opacity="0" BorderThickness="2" BorderBrush="White" HorizontalAlignment="Stretch" x:Name="glow" Width="Auto" Grid.RowSpan="2" CornerRadius="4">
<Border.BitmapEffect>
<BlurBitmapEffect Radius="2" />
</Border.BitmapEffect>
</Border>
<ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center" Width="Auto" Grid.RowSpan="2" SnapsToDevicePixels="True" />
<Border HorizontalAlignment="Stretch" Margin="0,0,0,0" x:Name="shine" Width="Auto" CornerRadius="4,4,8,8">
<Border.Background>
<LinearGradientBrush EndPoint="0.494,0.889" StartPoint="0.494,0.028">
<GradientStop Color="#AAFFFFFF" Offset="0"/>
<GradientStop Color="#33FFFFFF" Offset="1"/>
</LinearGradientBrush>
</Border.Background>
</Border>
</Grid>
</Border>
</Border>
<ControlTemplate.Triggers>
<Trigger Property="IsPressed" Value="True">
<Setter Property="Opacity" TargetName="shine" Value="0.4"/>
<Setter Property="Background" TargetName="border" Value="#CC000000"/>
<Setter Property="Visibility" TargetName="glow" Value="Hidden"/>
</Trigger>
<Trigger Property="IsMouseOver" Value="True">
<Trigger.EnterActions>
<BeginStoryboard Storyboard="{StaticResource Timeline1}"/>
</Trigger.EnterActions>
<Trigger.ExitActions>
<BeginStoryboard x:Name="Timeline2_BeginStoryboard" Storyboard="{StaticResource Timeline2}"/>
</Trigger.ExitActions>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
由于项目截止日期,我将标记直接移动到父控件中以解决问题。这就是说,如果有人对可能导致问题的原因有任何想法 - 任何帮助仍然会受到赞赏。
答案 0 :(得分:2)
好的,我很尴尬。事实证明,我忘了在UserControl标记的顶部添加对包含模板的资源的引用。我的UserControl文件中的前几行标记应该类似于以下内容:
<UserControl.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="/MyTemplates/MyTemplate.xaml" />
</ResourceDictionary.MergedDictionaries>...
但很奇怪,只有设计师在应用程序仍然编译和正常工作时抱怨。
答案 1 :(得分:0)
是否还有其他嵌套异常?
我已经看到过这样的事情(比如模板中的转换器)抛出了一些其他异常,或者依赖于Application.Current。 (app.current在设计时是VS或Blend,在运行时是你的应用程序)