2011-01-16 4 views
2

Also habe ich diese Validierungsmethode, die die Benutzereingabe überprüft. Wenn die Eingabe falsch ist oder fehlt, setzen Sie den Rand des Textblocks auf rot. Andernfalls wird es zurückgesetzt. Dieser Code funktioniert jedoch überhaupt nicht. Manchmal ist die Grenze auf Rot gesetzt, manchmal ist es nicht, wenn es sein sollte usw. Es ist fast so, als ob die Steuerung sich nicht selbst neu streicht.Windows Phone 7 BorderBrush kann nur einmal eingestellt werden?

Was mache ich falsch?

 private SolidColorBrush _errorBorderBrush = new SolidColorBrush(Colors.Red); 
     private SolidColorBrush _normalBorderBrush = new SolidColorBrush(Colors.Black); 

     private bool Validate() 
     { 
      if(txtName.Text == string.Empty) 
      { 
       txtName.BorderBrush = _errorBorderBrush; 
       return false; 
      } 
      else 
      { 
       txtName.BorderBrush = _normalBorderBrush; 
      } 

      if (pwdPassword.Password == string.Empty) 
      { 
       pwdPassword.BorderBrush = _errorBorderBrush; 
       return false; 
      } 
      else 
      { 
       pwdPassword.BorderBrush = _normalBorderBrush; 
      } 

      ... 
     } 

Antwort

1

hatte ich das gleiche Problem, und obwohl ich kein Experte für WP7 oder SL bin/WPF Entwicklung Ich denke das Problem mit dem Standard-TextBox Vorlage der den BorderBrush zurück, um es zurückkehrt Focused Zustand nicht zu tun, ist ursprüngliche Einstellung (Das gleiche Problem scheint auch mit der Background-Eigenschaft zu bestehen.) Ich habe es geschafft, dies zu lösen, indem ich meine eigene Vorlage in XAML verwendete ... Ich habe keine Blend-Installation installiert, daher weiß ich nicht, wie ich die ursprüngliche Vorlage herausziehen soll aber bezogen auf this page denke ich, die ursprüngliche Vorlage ist wie folgt:

<Style TargetType="TextBox"> 
<Setter Property="FontFamily" Value="{StaticResource PhoneFontFamilyNormal}"/> 
<Setter Property="FontSize" Value="{StaticResource PhoneFontSizeMediumLarge}"/> 
<Setter Property="Background" Value="{StaticResource PhoneTextBoxBrush}"/> 
<Setter Property="Foreground" Value="{StaticResource PhoneTextBoxForegroundBrush}"/> 
<Setter Property="BorderBrush" Value="{StaticResource PhoneTextBoxBrush}"/> 
<Setter Property="SelectionBackground" Value="{StaticResource PhoneAccentBrush}"/> 
<Setter Property="SelectionForeground" Value="{StaticResource PhoneTextBoxSelectionForegroundBrush}"/> 
<Setter Property="BorderThickness" Value="{StaticResource PhoneBorderThickness}"/> 
<Setter Property="Padding" Value="2"/> 
<Setter Property="Template"> 
    <Setter.Value> 
     <ControlTemplate TargetType="TextBox"> 
      <Grid Background="Transparent"> 
       <VisualStateManager.VisualStateGroups> 
        <VisualStateGroup x:Name="CommonStates"> 
         <VisualState x:Name="Normal"/> 
         <VisualState x:Name="MouseOver"/> 
         <VisualState x:Name="Disabled"> 
          <Storyboard> 
           <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="Visibility" Storyboard.TargetName="EnabledBorder"> 
            <DiscreteObjectKeyFrame KeyTime="0"> 
             <DiscreteObjectKeyFrame.Value> 
              <Visibility>Collapsed</Visibility> 
             </DiscreteObjectKeyFrame.Value> 
            </DiscreteObjectKeyFrame> 
           </ObjectAnimationUsingKeyFrames> 
           <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="Visibility" Storyboard.TargetName="DisabledOrReadonlyBorder"> 
            <DiscreteObjectKeyFrame KeyTime="0"> 
             <DiscreteObjectKeyFrame.Value> 
              <Visibility>Visible</Visibility> 
             </DiscreteObjectKeyFrame.Value> 
            </DiscreteObjectKeyFrame> 
           </ObjectAnimationUsingKeyFrames> 
          </Storyboard> 
         </VisualState> 
         <VisualState x:Name="ReadOnly"> 
          <Storyboard> 
           <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="Visibility" Storyboard.TargetName="EnabledBorder"> 
            <DiscreteObjectKeyFrame KeyTime="0"> 
             <DiscreteObjectKeyFrame.Value> 
              <Visibility>Collapsed</Visibility> 
             </DiscreteObjectKeyFrame.Value> 
            </DiscreteObjectKeyFrame> 
           </ObjectAnimationUsingKeyFrames> 
           <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="Visibility" Storyboard.TargetName="DisabledOrReadonlyBorder"> 
            <DiscreteObjectKeyFrame KeyTime="0"> 
             <DiscreteObjectKeyFrame.Value> 
              <Visibility>Visible</Visibility> 
             </DiscreteObjectKeyFrame.Value> 
            </DiscreteObjectKeyFrame> 
           </ObjectAnimationUsingKeyFrames> 
           <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="Background" Storyboard.TargetName="DisabledOrReadonlyBorder"> 
            <DiscreteObjectKeyFrame KeyTime="0" Value="{StaticResource PhoneTextBoxBrush}"/> 
           </ObjectAnimationUsingKeyFrames> 
           <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="BorderBrush" Storyboard.TargetName="DisabledOrReadonlyBorder"> 
            <DiscreteObjectKeyFrame KeyTime="0" Value="{StaticResource PhoneTextBoxBrush}"/> 
           </ObjectAnimationUsingKeyFrames> 
           <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="Foreground" Storyboard.TargetName="DisabledOrReadonlyContent"> 
            <DiscreteObjectKeyFrame KeyTime="0" Value="{StaticResource PhoneTextBoxReadOnlyBrush}"/> 
           </ObjectAnimationUsingKeyFrames> 
          </Storyboard> 
         </VisualState> 
        </VisualStateGroup> 
        <VisualStateGroup x:Name="FocusStates"> 
         <VisualState x:Name="Focused"> 
          <Storyboard> 
           <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="Background" Storyboard.TargetName="EnabledBorder"> 
            <DiscreteObjectKeyFrame KeyTime="0" Value="{StaticResource PhoneTextBoxEditBackgroundBrush}"/> 
           </ObjectAnimationUsingKeyFrames> 
           <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="BorderBrush" Storyboard.TargetName="EnabledBorder"> 
            <DiscreteObjectKeyFrame KeyTime="0" Value="{StaticResource PhoneTextBoxEditBorderBrush}"/> 
           </ObjectAnimationUsingKeyFrames> 
          </Storyboard> 
         </VisualState> 
         <VisualState x:Name="Unfocused"/> 
        </VisualStateGroup> 
       </VisualStateManager.VisualStateGroups> 
       <Border x:Name="EnabledBorder" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" Margin="{StaticResource PhoneTouchTargetOverhang}"> 
        <ContentControl x:Name="ContentElement" BorderThickness="0" HorizontalContentAlignment="Stretch" Margin="{StaticResource PhoneTextBoxInnerMargin}" Padding="{TemplateBinding Padding}" VerticalContentAlignment="Stretch"/> 
       </Border> 
       <Border x:Name="DisabledOrReadonlyBorder" BorderBrush="{StaticResource PhoneDisabledBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="Transparent" Margin="{StaticResource PhoneTouchTargetOverhang}" Visibility="Collapsed"> 
        <TextBox x:Name="DisabledOrReadonlyContent" Background="Transparent" Foreground="{StaticResource PhoneDisabledBrush}" FontWeight="{TemplateBinding FontWeight}" FontStyle="{TemplateBinding FontStyle}" FontSize="{TemplateBinding FontSize}" FontFamily="{TemplateBinding FontFamily}" IsReadOnly="True" SelectionForeground="{TemplateBinding SelectionForeground}" SelectionBackground="{TemplateBinding SelectionBackground}" TextAlignment="{TemplateBinding TextAlignment}" TextWrapping="{TemplateBinding TextWrapping}" Text="{TemplateBinding Text}" Template="{StaticResource PhoneDisabledTextBoxTemplate}"/> 
       </Border> 
      </Grid> 
     </ControlTemplate> 
    </Setter.Value> 
</Setter> 

Ich brauche den Focused Zustand nicht anders aussehen als die Unfocused Zustand, also habe ich die FocusStates Visual wie folgt aussehen:

<VisualStateGroup x:Name="FocusStates"> 
    <VisualState x:Name="Focused" /> 
    <VisualState x:Name="Unfocused"/> 
</VisualStateGroup> 

Ja, ich weiß, nicht die eleganteste Lösung, aber es funktionierte für ich und hoffentlich hilft dir das wenigstens in die richtige Richtung!

0

Es könnte der Rückruf sein. return bedeutet nur Rückkehr/Cancel-Methode. Bei einer Rückkehr bricht man direkt aus der Methode aus. Also, wenn txtName ist leer, wird pwdPassword nicht überprüft usw.

+0

Nein ist es nicht. Zum Beispiel, wenn ich die Methode aufrufen und txtName leer ist, soll der Rahmen rot werden. Wenn ich es kurz danach mit Text in txtName anrufe, verschwindet der Rahmen nicht. – Dylan

0

Was Sie mit den Farben tun, sollte funktionieren, wenn Sie Logik ist ok. Wir können nicht alles sehen, aber Sie sollten in der Lage sein, es im Debuger zu durchlaufen und zu sehen, warum es vielleicht nicht aufgerufen wird.

Hier ist ein Beispielcode, der die Farbe von grün nach rot und zurück bei aufeinanderfolgenden Tastenklicks ändert.

Seite Klassenfelder

SolidColorBrush green = new SolidColorBrush(Colors.Green); 
SolidColorBrush red = new SolidColorBrush(Colors.Red); 

Button-Event-Handler

if (textBox1.BorderBrush != green) { 
     textBox1.BorderBrush = green; 
    } else { 
     textBox1.BorderBrush = red; 
    } 

Wenn Sie immer noch Probleme, ich würde vorschlagen, ein Repro-Projekt erstellen. Es kann das Problem für Sie aufdecken, und wenn nicht, können Sie es hier veröffentlichen, damit Leute sehen können, wo Ihr Problem reproduziert werden kann.