2013-06-04 15 views
9

Ho le seguenti definizioni di stile:PasswordBox non si assume stile

<!-- Border --> 
<Style x:Key="MyControlBorder" TargetType="{x:Type Border}"> 
    <Setter Property="BorderBrush" Value="DarkKhaki" /> 
    <Setter Property="Background" Value="White" /> 
    <Setter Property="BorderThickness" Value="1" /> 
    <Setter Property="CornerRadius" Value="10" /> 
</Style> 

<!-- TextBox --> 
<Style x:Key="MyTextBox" TargetType="{x:Type TextBox}"> 
    <Setter Property="Height" Value="30" /> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="{x:Type TextBoxBase}"> 
       <Border Name="TextBoxBorder" Style="{StaticResource MyControlBorder}"> 
        <ScrollViewer x:Name="PART_ContentHost"/> 
       </Border> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 

<!-- PasswordBox --> 
<Style x:Key="MyPasswordBox" TargetType="{x:Type PasswordBox}"> 
    <Setter Property="Height" Value="30" /> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="{x:Type Control}"> 
       <Border Name="Border" Style="{StaticResource MyControlBorder}"> 
        <ScrollViewer x:Name="PART_ContentHost" /> 
       </Border> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 

e il seguente codice XAML:

<Grid> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="*" /> 
     <RowDefinition Height="*" /> 
    </Grid.RowDefinitions> 
    <TextBox Grid.Row="0" Style="{StaticResource MyTextBox}" /> 
    <PasswordBox Grid.Row="1" Style="{StaticResource MyPasswordBox}" /> 
</Grid> 

Ora ho ottenuto questo risultato: result

Il TextBox centro assumono lo stile correttamente, ma perché il PasswordBox non assume lo stile?

+0

Hai provato a utilizzare qualcosa come [Snoop] (http://snoopwpf.codeplex.com/) per scoprire da dove il confine sta ottenendo i suoi valori in fase di runtime? È possibile che qualcosa stia impostando gli stili dei bordi su un valore più elevato [Dependency Property Precedence] (http://msdn.microsoft.com/en-us/library/ms743230.aspx#listing) – Rachel

risposta

1

In qualche modo Border all'interno di ControlTemplate di PasswordBox non accetta lo stile MyControlBorder.

Quando si modifica lo stile MyPasswordBox in questo modo ... funzionerà.

<Style x:Key="MyPasswordBox" TargetType="{x:Type PasswordBox}"> 
<Setter Property="Height" Value="30" /> 
<Setter Property="Template"> 
    <Setter.Value> 
     <ControlTemplate TargetType="{x:Type Control}"> 
      <Border Name="Border" BorderBrush="DarkKhaki" Background="White" BorderThickness="1" CornerRadius="10"> 
       <ScrollViewer x:Name="PART_ContentHost" /> 
      </Border> 
     </ControlTemplate> 
    </Setter.Value> 
</Setter> 

io so che non è la soluzione migliore ... ma non riesco a capire perché MyControlBorder non è applicata. Non funziona nemmeno quando ti liberi dello stile MyTextBox. Quindi sei lasciato solo con MyControlBorder e MyPasswordBox ... non funziona neanche.

2

Se si avvolge lo Border in un altro Border, tutto funziona come previsto (non so perché).

Come bonus, ora è possibile avere PasswordBox es e TextBox es "ereditare" dallo stesso Style, mantenendo le cose belle e ASCIUTTE.

<!-- Border Style Definition --> 
<Style x:Key="MyControlBorder" TargetType="Border"> 
    <Setter Property="BorderBrush" Value="DarkKhaki" /> 
    <Setter Property="Background" Value="White" /> 
    <Setter Property="BorderThickness" Value="1" /> 
    <Setter Property="CornerRadius" Value="10" /> 
</Style> 

<!-- TextBox and PasswordBox Style --> 
<Style x:Key="MyControlInputBox" TargetType="Control"> 
    <Setter Property="Height" Value="30" /> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="{x:Type Control}"> 
       <Border> 
        <Border Name="Border" Style="{StaticResource MyControlBorder}"> 
         <ScrollViewer x:Name="PART_ContentHost" /> 
        </Border> 
       </Border> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 

<!-- TextBox --> 
<Style x:Key="MyTextBox" TargetType="{x:Type TextBox}" BasedOn="{StaticResource MyControlInputBox}" /> 

<!-- PasswordBox --> 
<Style x:Key="MyPasswordBox" TargetType="{x:Type PasswordBox}" BasedOn="{StaticResource MyControlInputBox}" /> 
+0

css è fantastico, xaml non è così fantastico: P – CRice

+0

Ho anche aggiunto '' a MyControlInputBox, altrimenti il ​​cursore era troppo alto. – CRice

Problemi correlati