2011-07-27 69 views
0

我有一個Silverlight應用程序,我嘗試着設計。當控件獲得焦點時,這種風格簡單地淡入淡出。當控件沒有焦點時,我希望它恢復到原來的樣子。我的風格目前有兩個問題:Silverlight中的模板問題

  1. 當用戶在文本框中單擊時,如果鼠標光標在其上方,則似乎將1px邊框添加到右邊緣。但是,如果在控件具有焦點時將鼠標光標移出,則間隙僅出現在右側邊緣。
  2. 我的轉換似乎沒有從焦點狀態變爲非選定狀態。

有人可以看看我的模板,並幫助我確定我做錯了什麼嗎?我已將我的代碼添加到了哪裏,並且您應該能夠複製並粘貼它。

<sdk:Page xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
    xmlns:sdk="http://schemas.microsoft.com/winfx/2006/xaml/presentation/sdk" xmlns:System="clr-namespace:System;assembly=mscorlib" 
    xmlns:ei="http://schemas.microsoft.com/expression/2010/interactions" xmlns:ee="http://schemas.microsoft.com/expression/2010/effects" 
    mc:Ignorable="d" 
    x:Class="InputFocusBlur.Input" 
    Title="Input Page" 
    d:DesignWidth="640" d:DesignHeight="480"> 

    <sdk:Page.Resources> 
    <ControlTemplate x:Key="ValidationToolTipTemplate"> 
     <Grid x:Name="Root" Margin="5,0" Opacity="0" RenderTransformOrigin="0,0"> 
     <Grid.RenderTransform> 
      <TranslateTransform x:Name="xform" X="-25"/> 
     </Grid.RenderTransform> 
     <VisualStateManager.VisualStateGroups> 
      <VisualStateGroup x:Name="OpenStates"> 
      <VisualStateGroup.Transitions> 
       <VisualTransition GeneratedDuration="0"/> 
       <VisualTransition GeneratedDuration="0:0:0.2" To="Open"> 
       <Storyboard> 
        <DoubleAnimation Duration="0:0:0.2" To="0" Storyboard.TargetProperty="X" Storyboard.TargetName="xform"> 
        <DoubleAnimation.EasingFunction> 
         <BackEase Amplitude=".3" EasingMode="EaseOut"/> 
        </DoubleAnimation.EasingFunction> 
        </DoubleAnimation> 
        <DoubleAnimation Duration="0:0:0.2" To="1" Storyboard.TargetProperty="Opacity" Storyboard.TargetName="Root"/> 
       </Storyboard> 
       </VisualTransition> 
      </VisualStateGroup.Transitions> 
      <VisualState x:Name="Closed"> 
       <Storyboard> 
       <DoubleAnimation Duration="0" To="0" Storyboard.TargetProperty="Opacity" Storyboard.TargetName="Root"/> 
       </Storyboard> 
      </VisualState> 
      <VisualState x:Name="Open"> 
       <Storyboard> 
       <DoubleAnimation Duration="0" To="0" Storyboard.TargetProperty="X" Storyboard.TargetName="xform"/> 
       <DoubleAnimation Duration="0" To="1" Storyboard.TargetProperty="Opacity" Storyboard.TargetName="Root"/> 
       </Storyboard> 
      </VisualState> 
      </VisualStateGroup> 
     </VisualStateManager.VisualStateGroups> 
     <Border Background="#052A2E31" CornerRadius="5" Margin="4,4,-4,-4"/> 
     <Border Background="#152A2E31" CornerRadius="4" Margin="3,3,-3,-3"/> 
     <Border Background="#252A2E31" CornerRadius="3" Margin="2,2,-2,-2"/> 
     <Border Background="#352A2E31" CornerRadius="2" Margin="1,1,-1,-1"/> 
     <Border Background="#FFDC000C" CornerRadius="2"/> 
     <Border CornerRadius="2"> 
      <TextBlock Foreground="White" MaxWidth="250" Margin="8,4,8,4" TextWrapping="Wrap" Text="{Binding (Validation.Errors)[0].ErrorContent}" UseLayoutRounding="false"/> 
     </Border> 
     </Grid> 
    </ControlTemplate> 
    <Style x:Key="myField" TargetType="TextBox"> 
     <Setter Property="BorderThickness" Value="1"/> 
     <Setter Property="Background" Value="#FFFFFFFF"/> 
     <Setter Property="Foreground" Value="#FF000000"/> 
     <Setter Property="Padding" Value="2"/> 
     <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="TextBox"> 
      <Grid x:Name="RootElement"> 
       <VisualStateManager.VisualStateGroups> 
       <VisualStateGroup x:Name="CommonStates"> 
        <VisualStateGroup.Transitions> 
        <VisualTransition GeneratedDuration="0:0:0.7" To="MouseOver"> 
         <ei:ExtendedVisualStateManager.TransitionEffect> 
         <ee:FadeTransitionEffect/> 
         </ei:ExtendedVisualStateManager.TransitionEffect> 
        </VisualTransition> 
        </VisualStateGroup.Transitions> 
        <VisualState x:Name="Normal"/> 
        <VisualState x:Name="MouseOver"> 
        <Storyboard> 
         <ColorAnimation Duration="0" To="#FF11DA0B" Storyboard.TargetProperty="(Border.BorderBrush).(SolidColorBrush.Color)" Storyboard.TargetName="MouseOverBorder"/> 
         <ColorAnimation Duration="0" To="#FF11DA0B" Storyboard.TargetProperty="(Border.BorderBrush).(SolidColorBrush.Color)" Storyboard.TargetName="FocusVisualElement" d:IsOptimized="True"/> 
         <ColorAnimation Duration="0" To="#FF11DA0B" Storyboard.TargetProperty="(Control.BorderBrush).(GradientBrush.GradientStops)[3].(GradientStop.Color)" Storyboard.TargetName="ContentElement" d:IsOptimized="True"/> 
         <ColorAnimation Duration="0" To="#FF11DA0B" Storyboard.TargetProperty="(Control.BorderBrush).(GradientBrush.GradientStops)[0].(GradientStop.Color)" Storyboard.TargetName="ContentElement" d:IsOptimized="True"/> 
         <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="(Border.BorderThickness)" Storyboard.TargetName="FocusVisualElement"> 
         <DiscreteObjectKeyFrame KeyTime="0"> 
          <DiscreteObjectKeyFrame.Value> 
          <Thickness>1</Thickness> 
          </DiscreteObjectKeyFrame.Value> 
         </DiscreteObjectKeyFrame> 
         </ObjectAnimationUsingKeyFrames> 
         <ColorAnimation Duration="0" To="#FF11DA0B" Storyboard.TargetProperty="(Border.BorderBrush).(SolidColorBrush.Color)" Storyboard.TargetName="Border" d:IsOptimized="True"/> 
        </Storyboard> 
        </VisualState> 
        <VisualState x:Name="Disabled"> 
        <Storyboard> 
         <DoubleAnimation Duration="0" To="1" Storyboard.TargetProperty="Opacity" Storyboard.TargetName="DisabledVisualElement"/> 
        </Storyboard> 
        </VisualState> 
        <VisualState x:Name="ReadOnly"> 
        <Storyboard> 
         <DoubleAnimation Duration="0" To="1" Storyboard.TargetProperty="Opacity" Storyboard.TargetName="ReadOnlyVisualElement"/> 
        </Storyboard> 
        </VisualState> 
       </VisualStateGroup> 
       <VisualStateGroup x:Name="FocusStates"> 
        <VisualStateGroup.Transitions> 
        <VisualTransition GeneratedDuration="0:0:0.7" To="Unfocused"> 
         <ei:ExtendedVisualStateManager.TransitionEffect> 
         <ee:FadeTransitionEffect/> 
         </ei:ExtendedVisualStateManager.TransitionEffect> 
        </VisualTransition> 
        </VisualStateGroup.Transitions> 
        <VisualState x:Name="Focused"> 
        <Storyboard> 
         <DoubleAnimation Duration="0" To="1" Storyboard.TargetProperty="Opacity" Storyboard.TargetName="FocusVisualElement"/> 
         <ColorAnimation Duration="0" To="#FF11DA0B" Storyboard.TargetProperty="(Border.BorderBrush).(SolidColorBrush.Color)" Storyboard.TargetName="Border" d:IsOptimized="True"/> 
         <ColorAnimation Duration="0" To="#FF11DA0B" Storyboard.TargetProperty="(Border.BorderBrush).(SolidColorBrush.Color)" Storyboard.TargetName="FocusVisualElement" d:IsOptimized="True"/> 
         <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="(Border.BorderThickness)" Storyboard.TargetName="FocusVisualElement"> 
         <DiscreteObjectKeyFrame KeyTime="0"> 
          <DiscreteObjectKeyFrame.Value> 
          <Thickness>1</Thickness> 
          </DiscreteObjectKeyFrame.Value> 
         </DiscreteObjectKeyFrame> 
         </ObjectAnimationUsingKeyFrames> 
        </Storyboard> 
        </VisualState> 
        <VisualState x:Name="Unfocused"> 
        <Storyboard> 
         <DoubleAnimation Duration="0" To="0" Storyboard.TargetProperty="Opacity" Storyboard.TargetName="FocusVisualElement"/> 
        </Storyboard> 
        </VisualState> 
       </VisualStateGroup> 
       <VisualStateGroup x:Name="ValidationStates"> 
        <VisualState x:Name="Valid"/> 
        <VisualState x:Name="InvalidUnfocused"> 
        <Storyboard> 
         <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="Visibility" Storyboard.TargetName="ValidationErrorElement"> 
         <DiscreteObjectKeyFrame KeyTime="0"> 
          <DiscreteObjectKeyFrame.Value> 
          <Visibility>Visible</Visibility> 
          </DiscreteObjectKeyFrame.Value> 
         </DiscreteObjectKeyFrame> 
         </ObjectAnimationUsingKeyFrames> 
        </Storyboard> 
        </VisualState> 
        <VisualState x:Name="InvalidFocused"> 
        <Storyboard> 
         <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="Visibility" Storyboard.TargetName="ValidationErrorElement"> 
         <DiscreteObjectKeyFrame KeyTime="0"> 
          <DiscreteObjectKeyFrame.Value> 
          <Visibility>Visible</Visibility> 
          </DiscreteObjectKeyFrame.Value> 
         </DiscreteObjectKeyFrame> 
         </ObjectAnimationUsingKeyFrames> 
         <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="IsOpen" Storyboard.TargetName="validationTooltip"> 
         <DiscreteObjectKeyFrame KeyTime="0"> 
          <DiscreteObjectKeyFrame.Value> 
          <System:Boolean>True</System:Boolean> 
          </DiscreteObjectKeyFrame.Value> 
         </DiscreteObjectKeyFrame> 
         </ObjectAnimationUsingKeyFrames> 
        </Storyboard> 
        </VisualState> 
       </VisualStateGroup> 
       </VisualStateManager.VisualStateGroups> 
       <VisualStateManager.CustomVisualStateManager> 
       <ei:ExtendedVisualStateManager/> 
       </VisualStateManager.CustomVisualStateManager> 
       <Border x:Name="Border" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" CornerRadius="1" Opacity="1" Margin="1,0,-1,0" BorderBrush="Black"> 
       <Grid> 
        <Border x:Name="ReadOnlyVisualElement" Background="#5EC9C9C9" Opacity="0"/> 
        <Border x:Name="MouseOverBorder" BorderBrush="Transparent" BorderThickness="1"> 
        <ScrollViewer x:Name="ContentElement" BorderThickness="0" IsTabStop="False" Padding="{TemplateBinding Padding}"/> 
        </Border> 
       </Grid> 
       </Border> 
       <Border x:Name="DisabledVisualElement" BorderBrush="#A5F7F7F7" BorderThickness="{TemplateBinding BorderThickness}" Background="#A5F7F7F7" IsHitTestVisible="False" Opacity="0"/> 
       <Border x:Name="FocusVisualElement" BorderBrush="#FF6DBDD1" IsHitTestVisible="False" Margin="1" Opacity="0"/> 
       <Border x:Name="ValidationErrorElement" BorderBrush="#FFDB000C" BorderThickness="1" CornerRadius="1" Visibility="Collapsed"> 
       <ToolTipService.ToolTip> 
        <ToolTip x:Name="validationTooltip" DataContext="{Binding RelativeSource={RelativeSource TemplatedParent}}" Placement="Right" PlacementTarget="{Binding RelativeSource={RelativeSource TemplatedParent}}" Template="{StaticResource ValidationToolTipTemplate}"> 
        <ToolTip.Triggers> 
         <EventTrigger RoutedEvent="Canvas.Loaded"> 
         <BeginStoryboard> 
          <Storyboard> 
          <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="IsHitTestVisible" Storyboard.TargetName="validationTooltip"> 
           <DiscreteObjectKeyFrame KeyTime="0"> 
           <DiscreteObjectKeyFrame.Value> 
            <System:Boolean>true</System:Boolean> 
           </DiscreteObjectKeyFrame.Value> 
           </DiscreteObjectKeyFrame> 
          </ObjectAnimationUsingKeyFrames> 
          </Storyboard> 
         </BeginStoryboard> 
         </EventTrigger> 
        </ToolTip.Triggers> 
        </ToolTip> 
       </ToolTipService.ToolTip> 
       <Grid Background="Transparent" HorizontalAlignment="Right" Height="12" Margin="1,-4,-4,0" VerticalAlignment="Top" Width="12"> 
        <Path Data="M 1,0 L6,0 A 2,2 90 0 1 8,2 L8,7 z" Fill="#FFDC000C" Margin="1,3,0,0"/> 
        <Path Data="M 0,0 L2,0 L 8,6 L8,8" Fill="#ffffff" Margin="1,3,0,0"/> 
       </Grid> 
       </Border> 
      </Grid> 
      </ControlTemplate> 
     </Setter.Value> 
     </Setter> 
    </Style> 
    </sdk:Page.Resources> 

    <Grid x:Name="LayoutRoot" Background="White" > 
    <TextBox HorizontalAlignment="Left" Height="29" Margin="48,194,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="270" Style="{StaticResource myField}"/> 
    </Grid> 
</sdk:Page> 

回答

0

您的myfield風格有幾個問題。首先,最重要的是,您要更改處於獨立VisualStateGroups中的Visual States中的相同屬性。這可能會導致不穩定的行爲(如果打開模板,Blend會顯示此警告)。

其次,你正在控制焦點元素的邊框顏色,加上主邊框。只要選擇一個就可以了。

嘗試這種風格,而不是修復這些問題。我想這就是你要找的東西:

<Style x:Key="myField" 
      TargetType="TextBox"> 
     <Setter Property="BorderThickness" 
       Value="1" /> 
     <Setter Property="Background" 
       Value="#FFFFFFFF" /> 
     <Setter Property="Foreground" 
       Value="#FF000000" /> 
     <Setter Property="Padding" 
       Value="2" /> 
     <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="TextBox"> 
        <Grid x:Name="RootElement"> 
         <VisualStateManager.VisualStateGroups> 
          <VisualStateGroup x:Name="CommonStates"> 

           <VisualStateGroup.Transitions> 
            <VisualTransition GeneratedDuration="0:0:0.7"/> 
           </VisualStateGroup.Transitions> 

           <VisualState x:Name="Normal" /> 
           <VisualState x:Name="MouseOver">           
            <Storyboard> 
             <DoubleAnimation Duration="0" To="1" Storyboard.TargetProperty="(UIElement.Opacity)" Storyboard.TargetName="MouseOverBorder" d:IsOptimized="True"/> 

            </Storyboard>           
           </VisualState> 
           <VisualState x:Name="Disabled"> 
            <Storyboard> 
             <DoubleAnimation Duration="0" 
              To="1" 
              Storyboard.TargetProperty="Opacity" 
              Storyboard.TargetName="DisabledVisualElement" /> 
            </Storyboard> 
           </VisualState> 
           <VisualState x:Name="ReadOnly"> 
            <Storyboard> 
             <DoubleAnimation Duration="0" 
              To="1" 
              Storyboard.TargetProperty="Opacity" 
              Storyboard.TargetName="ReadOnlyVisualElement" /> 
            </Storyboard> 
           </VisualState> 
          </VisualStateGroup> 
          <VisualStateGroup x:Name="FocusStates"> 
           <VisualStateGroup.Transitions> 
            <VisualTransition GeneratedDuration="0:0:0.7"/> 
           </VisualStateGroup.Transitions> 
           <VisualState x:Name="Focused"> 
            <Storyboard> 
             <DoubleAnimation Duration="0" 
              To="1" 
              Storyboard.TargetProperty="Opacity" 
              Storyboard.TargetName="FocusVisualElement" /> 
            </Storyboard> 
           </VisualState> 
           <VisualState x:Name="Unfocused"> 
            <Storyboard/> 
           </VisualState> 
          </VisualStateGroup> 
          <VisualStateGroup x:Name="ValidationStates"> 
           <VisualState x:Name="Valid" /> 
           <VisualState x:Name="InvalidUnfocused"> 
            <Storyboard> 
             <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="Visibility" 
                     Storyboard.TargetName="ValidationErrorElement"> 
              <DiscreteObjectKeyFrame KeyTime="0"> 
               <DiscreteObjectKeyFrame.Value> 
                <Visibility>Visible</Visibility> 
               </DiscreteObjectKeyFrame.Value> 
              </DiscreteObjectKeyFrame> 
             </ObjectAnimationUsingKeyFrames> 
            </Storyboard> 
           </VisualState> 
           <VisualState x:Name="InvalidFocused"> 
            <Storyboard> 
             <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="Visibility" 
                     Storyboard.TargetName="ValidationErrorElement"> 
              <DiscreteObjectKeyFrame KeyTime="0"> 
               <DiscreteObjectKeyFrame.Value> 
                <Visibility>Visible</Visibility> 
               </DiscreteObjectKeyFrame.Value> 
              </DiscreteObjectKeyFrame> 
             </ObjectAnimationUsingKeyFrames> 
             <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="IsOpen" 
                     Storyboard.TargetName="validationTooltip"> 
              <DiscreteObjectKeyFrame KeyTime="0"> 
               <DiscreteObjectKeyFrame.Value> 
                <System:Boolean>True</System:Boolean> 
               </DiscreteObjectKeyFrame.Value> 
              </DiscreteObjectKeyFrame> 
             </ObjectAnimationUsingKeyFrames> 
            </Storyboard> 
           </VisualState> 
          </VisualStateGroup> 
         </VisualStateManager.VisualStateGroups> 
         <VisualStateManager.CustomVisualStateManager> 
          <ei:ExtendedVisualStateManager /> 
         </VisualStateManager.CustomVisualStateManager> 
         <Border x:Name="Border" 
           Background="{TemplateBinding Background}" 
           CornerRadius="1" 
           Opacity="1" 
           BorderBrush="Black" 
           BorderThickness="1"> 
          <Grid> 
           <Border x:Name="ReadOnlyVisualElement" 
             Background="#5EC9C9C9" 
             Opacity="0" /> 
            <ScrollViewer x:Name="ContentElement" 
                BorderThickness="0" 
                IsTabStop="False" 
                Padding="{TemplateBinding Padding}" /> 
          </Grid> 
         </Border> 
         <Border x:Name="DisabledVisualElement" 
           BorderBrush="#A5F7F7F7" 
           BorderThickness="{TemplateBinding BorderThickness}" 
           Background="#A5F7F7F7" 
           IsHitTestVisible="False" 
           Opacity="0" /> 
         <Border x:Name="FocusVisualElement" 
           BorderBrush="#FF11DA0B" 
           IsHitTestVisible="False" 
           Margin="0" 
           Opacity="0" 
           BorderThickness="2" /> 
         <Border x:Name="MouseOverBorder" 
           BorderBrush="#FF11DA0B" 
           IsHitTestVisible="False" 
           Margin="0" 
           Opacity="0" 
           BorderThickness="2"/> 
         <Border x:Name="ValidationErrorElement" 
           BorderBrush="#FFDB000C" 
           BorderThickness="1" 
           CornerRadius="1" 
           Visibility="Collapsed"> 
          <ToolTipService.ToolTip> 
           <ToolTip x:Name="validationTooltip" 
             DataContext="{Binding RelativeSource={RelativeSource TemplatedParent}}" 
             Placement="Right" 
             PlacementTarget="{Binding RelativeSource={RelativeSource TemplatedParent}}" 
             Template="{StaticResource ValidationToolTipTemplate}"> 
            <ToolTip.Triggers> 
             <EventTrigger RoutedEvent="Canvas.Loaded"> 
              <BeginStoryboard> 
               <Storyboard> 
                <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="IsHitTestVisible" 
                        Storyboard.TargetName="validationTooltip"> 
                 <DiscreteObjectKeyFrame KeyTime="0"> 
                  <DiscreteObjectKeyFrame.Value> 
                   <System:Boolean>true</System:Boolean> 
                  </DiscreteObjectKeyFrame.Value> 
                 </DiscreteObjectKeyFrame> 
                </ObjectAnimationUsingKeyFrames> 
               </Storyboard> 
              </BeginStoryboard> 
             </EventTrigger> 
            </ToolTip.Triggers> 
           </ToolTip> 
          </ToolTipService.ToolTip> 
          <Grid Background="Transparent" 
            HorizontalAlignment="Right" 
            Height="12" 
            Margin="1,-4,-4,0" 
            VerticalAlignment="Top" 
            Width="12"> 
           <Path Data="M 1,0 L6,0 A 2,2 90 0 1 8,2 L8,7 z" 
             Fill="#FFDC000C" 
             Margin="1,3,0,0" /> 
           <Path Data="M 0,0 L2,0 L 8,6 L8,8" 
             Fill="#ffffff" 
             Margin="1,3,0,0" /> 
          </Grid> 
         </Border> 
        </Grid> 
       </ControlTemplate> 
      </Setter.Value> 
     </Setter> 
    </Style> 
+0

謝謝你的反饋。然而,我的挑戰是,當控件有一個鼠標放在它上面,或者有焦點時,我希望邊框的大小爲2像素。但是,當控件處於正常狀態或失去焦點時,我希望它回到1px邊框。這似乎是導致問題的原因。謝謝你的努力! – Villager

+0

我剛剛編輯了代碼並重新發布以包括鼠標懸停更改以及更改爲2的邊框厚度 – kbmax

+0

哦,我的話!非常感謝你的幫助。對於我的生活,我無法做到這一點。你是男人(或女人)! – Villager