2012-04-13 88 views
2

当它应用于文本框进入禁用状态时,以下样式将导致在'System.Windows.Controls.Grid'的名称范围中找不到''ContentElement'名称的异常。我在犯规现场添加了评论。任何想法如何我可以改正这一点,而不是只是评论它?WPF文本框样式抛出InvalidOperationException

<Style x:Key="ThemedTextBox" TargetType="{x:Type TextBox}"> 
     <Setter Property="BorderThickness" Value="1"/> 
     <Setter Property="Background" Value="#FFFFFFFF"/> 
     <Setter Property="Foreground" Value="White"/> 
     <Setter Property="Padding" Value="-1"/> 
     <Setter Property="BorderBrush"> 
      <Setter.Value> 
       <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0"> 
        <GradientStop Color="#FFA3AEB9" Offset="0"/> 
        <GradientStop Color="#FF8399A9" Offset="0.375"/> 
        <GradientStop Color="#FF718597" Offset="0.375"/> 
        <GradientStop Color="#FF617584" Offset="1"/> 
       </LinearGradientBrush> 
      </Setter.Value> 
     </Setter> 
     <Setter Property="Template"> 
      <Setter.Value> 
       <ControlTemplate TargetType="{x:Type TextBox}"> 
        <Grid x:Name="RootElement"> 
         <VisualStateManager.VisualStateGroups> 
          <VisualStateGroup x:Name="CommonStates"> 
           <VisualStateGroup.Transitions> 
            <VisualTransition GeneratedDuration="00:00:00.1" To="MouseOver"/> 
            <VisualTransition GeneratedDuration="00:00:00.1" To="ReadOnly"/> 
            <VisualTransition GeneratedDuration="00:00:00.1" To="Disabled"/> 
           </VisualStateGroup.Transitions> 
           <VisualState x:Name="Normal"/> 
           <VisualState x:Name="MouseOver"> 
            <Storyboard> 
             <DoubleAnimationUsingKeyFrames BeginTime="00:00:00" Duration="00:00:00.0010000" Storyboard.TargetName="MouseOverState" Storyboard.TargetProperty="(UIElement.Opacity)"> 
              <SplineDoubleKeyFrame KeyTime="00:00:00" Value="1"/> 
             </DoubleAnimationUsingKeyFrames> 
            </Storyboard> 
           </VisualState> 
           <VisualState x:Name="Disabled"> 
            <Storyboard> 
             <!--DoubleAnimationUsingKeyFrames BeginTime="00:00:00" Duration="00:00:00.0010000" Storyboard.TargetName="DisabledState" Storyboard.TargetProperty="(UIElement.Opacity)"> 
              <SplineDoubleKeyFrame KeyTime="00:00:00" Value="1"/> 
             </DoubleAnimationUsingKeyFrames> 
    <!--************** This is where the problem is **************--> 
           <ColorAnimationUsingKeyFrames BeginTime="00:00:00" Duration="00:00:00.0010000" Storyboard.TargetName="ContentElement" Storyboard.TargetProperty="(Control.Foreground).(SolidColorBrush.Color)"> 
              <SplineColorKeyFrame KeyTime="00:00:00" Value="#FF808080"/> 
             </ColorAnimationUsingKeyFrames--> 
            </Storyboard> 
           </VisualState> 
           <VisualState x:Name="ReadOnly"> 
            <Storyboard/> 
           </VisualState> 
          </VisualStateGroup> 
          <VisualStateGroup x:Name="FocusStates"> 
           <VisualState x:Name="Focused"> 
            <Storyboard> 
             <DoubleAnimationUsingKeyFrames BeginTime="00:00:00" Duration="00:00:00.0010000" Storyboard.TargetName="MouseOverState" Storyboard.TargetProperty="(UIElement.Opacity)"> 
              <SplineDoubleKeyFrame KeyTime="00:00:00" Value="1"/> 
             </DoubleAnimationUsingKeyFrames> 
            </Storyboard> 
           </VisualState> 
           <VisualState x:Name="Unfocused"> 
            <Storyboard/> 
           </VisualState> 
          </VisualStateGroup> 
         </VisualStateManager.VisualStateGroups> 

         <Grid Margin="0,0,0,0" x:Name="NormalState"> 
          <Rectangle HorizontalAlignment="Stretch" Margin="0,0,0,0" VerticalAlignment="Stretch" RadiusX="0" RadiusY="0" Fill="{StaticResource GlossyBlack_TextBoxBackgroundGradient}"> 
          </Rectangle> 
          <Rectangle HorizontalAlignment="Stretch" Margin="0,0,0,0" VerticalAlignment="Stretch" RadiusX="0" RadiusY="0" Stroke="{StaticResource GlossyBlack_TextBoxStroke}"> 
          </Rectangle> 
          <Rectangle HorizontalAlignment="Stretch" Margin="0,0,0,0" VerticalAlignment="Stretch" RadiusX="0" RadiusY="0" Height="Auto" Fill="{StaticResource GlossyBlack_TextBoxHighlightGradient}"/> 

         </Grid> 
         <Grid Margin="0,0,0,0" x:Name="MouseOverState" Opacity="0"> 
          <Rectangle HorizontalAlignment="Stretch" Margin="0,0,0,0" VerticalAlignment="Stretch" RadiusX="0" RadiusY="0" Fill="{StaticResource GlossyBlack_TextBoxBackgroundGradient}"/> 
          <Rectangle HorizontalAlignment="Stretch" Margin="0,0,0,0" VerticalAlignment="Stretch" RadiusX="0" RadiusY="0" Stroke="{StaticResource GlossyBlack_TextBoxStroke}"/> 
          <Rectangle HorizontalAlignment="Stretch" Margin="0,0,0,0" VerticalAlignment="Stretch" RadiusX="0" RadiusY="0" Height="Auto" Fill="{StaticResource GlossyBlack_TextBoxMouseOverHighlight}"/> 

         </Grid> 
         <Grid Margin="0,0,0,0" x:Name="DisabledState" Opacity="0"> 
          <Rectangle HorizontalAlignment="Stretch" Margin="0,0,0,0" VerticalAlignment="Stretch" RadiusX="0" RadiusY="0" Fill="{StaticResource GlossyBlack_TextBoxDisabledBackground}"/> 
          <Rectangle HorizontalAlignment="Stretch" Margin="0,0,0,0" VerticalAlignment="Stretch" RadiusX="0" RadiusY="0" Stroke="{StaticResource GlossyBlack_TextBoxStroke}"/> 

         </Grid> 

         <ScrollViewer BorderThickness="0" IsTabStop="False" Padding="{TemplateBinding Padding}" Margin="4,4,4,4" x:Name="PART_ContentHost" BorderBrush="{x:Null}" Foreground="#FFFFFFFF"/> 
        </Grid> 
       </ControlTemplate> 
      </Setter.Value> 
     </Setter> 
    </Style> 
+1

如果您的风格没有名称为ContentElement的元素,它将如何工作? – Nikolay 2012-04-13 14:29:48

回答

1

我不认为你需要在所有的指定目标,删除它,事情应该开始工作

Storyboard.TargetName="ContentElement" 

它看起来像一个简单的复制/粘贴错误。但为了以防万一,您不必在自己的样式触发器上指定目标(仅当它在模板触发器中,并且您正在操作模板中的各种元素,或者动画是在样式外声明的,而且必须引用一个元素...

+0

只是测试它,它做到了.. – 2012-04-13 15:34:01

-1

是您的文本框“ContentElement”的名称,如果不是,它应该是。

如果你看一下例子文档中......

http://msdn.microsoft.com/en-us/library/system.windows.media.animation.storyboard.targetname.aspx

...那么你会看到Storyboard.TargetName必须在XAML给出一个有效的项目的名称。

+0

提到的“ContentElement”并不是指整个TextBox的名称,它应该引用在ControlTemplate中定义的一个元素,它在其中被提及。调用TextBox“ContentElement”将无济于事,因为模板无法在其自身之外看到。 – 2012-04-13 15:30:53

+0

呃鲍勃......你应该在注意否定之前注意。提问者说他​​正在将它应用到TextBox中。如果他把TextBox的名字放在那里,它就会起作用。 Denis Moroov也是正确的,因为您可以完全删除该行。 – Rhyous 2012-04-13 15:40:10

+0

如果我正确理解你的答案,你的建议是用提问者定义的样式声明文本框。即。不幸的是,这不起作用,因为Style资源中定义的ContentTemplate无法看到该TextBox。如果我误解了你,请澄清你的意思。谢谢。 – 2012-04-13 15:47:19

0

我假设提供ColorAnimationUsingKeyFrames的意图是做一些色彩动画时被启用被禁用箱变。

然而,你DoubleAnimationUsingKeyFrames,它控制的不透明度背景网格已经非常多,所以我不认为你需要包括ColorAnimationUsingKeyFrames。

作为其他rs说过,你的直接问题正是错误信息所说的:ControlTemplate中没有一个名为“ContentElement”的元素。你最好的选择就是去除我想的整个ColorAnimationUsingKeyFrames。

相关问题