2010-09-05 13 views
8

Bir WPF uygulamasına sahibim ve .Net v4 Visual State Manager'ı kullanarak bir TextBox'ı biçimlendirmeye çalışıyorum. Özellikle, MouseOver durumu için ön plan ve arka plan renkleri ayarlamaya çalışıyorum.Sorun belirleme Visual State Manager ile ön plan alanı

Olanak şudur: Arka plan ve kenarlıklar mükemmel bir şekilde değişirken ön planda değildir. Kullandığım fırçalar renklerini StaticResource aracılığıyla alıyorsa, ön plan hiç değişmez. Kullandığım fırçalar bir DynamicResource aracılığıyla renklerini alıyorsa, bir TextBox'u farenin üzerine getirdiğimde, tüm TextBox'ların ön planı değişir. Açıkçası, ya yanlış bir şey yapıyorum ya da yapmak istediğim sadece VSM ile mümkün değil (ki bu oldukça hayal kırıklığı yaratacaktır). İşte

kullanıyorum kaynakları şunlardır:

Mükemmel bakılmaksızın I bakılmaksızın oluşturulan ve aynı şekilde animasyonlu arka plan ve yatılı fırçaları, işe bu bana çok garip
<Color x:Key="ControlBackgroundColor" R="178" G="178" B="178" A="255" /> 
<Color x:Key="ControlForegroundColor" R="0" G="0" B="0" A="255" /> 
<Color x:Key="BorderColor" R="127" G="127" B="127" A="255" /> 
<Color x:Key="MouseOverControlBackgroundColor" R="0" G="0" B="0" A="255" /> 
<Color x:Key="MouseOverControlForegroundColor" R="255" G="255" B="255" A="255" /> 
<Color x:Key="MouseOverBorderColor" R="178" G="178" B="178" A="255" /> 

<SolidColorBrush PresentationOptions:Freeze="True" x:Key="ControlBackgroundBrush" Color="{DynamicResource ControlBackgroundColor}" /> 
<SolidColorBrush PresentationOptions:Freeze="True" x:Key="ControlForegroundBrush" Color="{DynamicResource ControlForegroundColor}" /> 
<SolidColorBrush PresentationOptions:Freeze="True" x:Key="BorderBrush" Color="{DynamicResource BorderColor}" /> 

<SolidColorBrush PresentationOptions:Freeze="True" x:Key="MouseOverControlBackgroundBrush" Color="{DynamicResource MouseOverControlBackgroundColor}" /> 
<SolidColorBrush PresentationOptions:Freeze="True" x:Key="MouseOverControlForegroundBrush" Color="{DynamicResource MouseOverControlForegroundColor}" /> 
<SolidColorBrush PresentationOptions:Freeze="True" x:Key="MouseOverBorderBrush" Color="{DynamicResource MouseOverBorderColor}" /> 

<Style TargetType="{x:Type TextBox}" > 
    <Setter Property="BorderThickness" Value="1"/> 
    <Setter Property="Padding" Value="2"/> 
    <Setter Property="Margin" Value="1" /> 
    <Setter Property="BorderBrush" Value="{DynamicResource BorderBrush}" /> 
    <Setter Property="Background" Value="{DynamicResource ControlBackgroundBrush}" /> 
    <Setter Property="Foreground" Value="{DynamicResource ControlForegroundBrush}" /> 

    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="TextBox"> 
       <Grid x:Name="RootElement"> 
        <VisualStateManager.VisualStateGroups> 
         <VisualStateGroup x:Name="CommonStates"> 
          <VisualState x:Name="Normal"/> 
          <VisualState x:Name="MouseOver"> 
           <Storyboard> 
            <ColorAnimation Storyboard.TargetName="MouseOverBorder" Storyboard.TargetProperty="(Border.BorderBrush).(SolidColorBrush.Color)" To="{DynamicResource MouseOverBorderColor}" Duration="0:0:0.3"/> 
            <ColorAnimation Storyboard.TargetName="MouseOverBorder" Storyboard.TargetProperty="(Border.Background).(SolidColorBrush.Color)" To="{DynamicResource MouseOverControlBackgroundColor}" Duration="0:0:0.3"/> 
            <ColorAnimation Storyboard.TargetName="PART_ContentHost" Storyboard.TargetProperty="(Foreground).(SolidColorBrush.Color)" To="{DynamicResource MouseOverControlForegroundColor}" Duration="0:0:0.3"/> 
           </Storyboard> 
          </VisualState> 
         </VisualStateGroup> 
        </VisualStateManager.VisualStateGroups> 
        <Border x:Name="Border" BorderThickness="{TemplateBinding BorderThickness}" CornerRadius="1" Opacity="1" Background="{TemplateBinding Background}" BorderBrush="{TemplateBinding BorderBrush}"> 
         <Grid x:Name="ContentGrid"> 
          <Border x:Name="MouseOverBorder" BorderThickness="1" BorderBrush="Transparent" Background="Transparent"> 
           <ScrollViewer x:Name="PART_ContentHost" Padding="{TemplateBinding Padding}" Foreground="{TemplateBinding Foreground}" BorderThickness="0" IsTabStop="False"/> 
          </Border> 
         </Grid> 
        </Border> 
       </Grid> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 

Statik veya Dinamik kaynakları kullanın, ancak Ön Plan renginde değil.

Herhangi bir fikri olduğunda veya bunu yapmanın daha iyi bir yolu varsa, bunu duymak isterim.

David Mullin IMA Teknolojileri

cevap

15

değerleri bağlayıcı aracılığıyla ayarlanır VisualStateManager kontrol edemez özellikleri. Örneğinizde, hem Background hem de BorderBrush yerel değerlere (Transparent) ayarlanmıştır ve bu nedenle VSM bunları canlandırabilir. Diğer yandan, Foreground bir TemplateBinding kullanılarak ayarlanır ve böylece bir bağlanma değeri etkinse, VSM onu canlandıramaz.

Bu, VisualStateManager'un genel bir sınırlamasıdır ve kullanıldığı tüm örneklerde göreceksiniz. Sorunun etrafında çalışmak için tipik bir strateji, gerçekte olan şey bir öğeden diğerine bir solma olduğunda renk animasyonu yanılsamasını vermek için katmanları ve opaklığı kullanmaktır. Bu, gizli katman üzerinde tam kontrole sahip olduğunuz ve herhangi bir şeye bağlamak zorunda olmadığınız için çalışır. Ne yazık ki bu, ihtiyaçlarınız için işe yaramaz çünkü element statik değil; İki metin kutunuz olamaz.

Net efekt, her ikisinin de önplan rengini canlandırabileceğini ve önplan renginin kullanıcı tarafından belirtilebildiğini düşünmüyorum.

İlgili konular