2013-06-04 13 views
9

Mam następujące definicje stylu:PasswordBox nie ponosi styl

<!-- 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> 

i następujący kod 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> 

Teraz mam to wyniki: result

TextBox przyjęłoby styl poprawnie, ale dlaczego PasswordBox nie przyjmuje stylu?

+0

Czy próbowałeś użyć czegoś takiego jak [Snoop] (http://snoopwpf.codeplex.com/), aby dowiedzieć się, gdzie granica uzyskuje wartości z czasu wykonywania? Jest to możliwe coś jest ustawienie style obramowania na wyższym [Dependency obiektu pierwszeństwa] (http://msdn.microsoft.com/en-us/library/ms743230.aspx#listing) – Rachel

Odpowiedz

1

Jakoś Border w ramach ControlTemplate z PasswordBox nie przyjmuje stylu MyControlBorder.

Podczas modyfikacji MyPasswordBox stylu jak to ... to będzie działać.

<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> 

wiem, że to nie jest najlepsze rozwiązanie ... ale nie mogę zrozumieć dlaczego MyControlBorder nie jest stosowana. To nawet nie działa, gdy pozbędziesz się stylu MyTextBox. Pozostaje ci tylko MyControlBorder i MyPasswordBox ... to też nie działa.

2

Jeśli otoczysz Border w innym Border wszystko działa zgodnie z oczekiwaniami (nie wiem dlaczego).

Jako bonus, możesz teraz mieć PasswordBox es i TextBox es "dziedziczyć" z tego samego Style, utrzymując rzeczy miłe i suche.

<!-- 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 jest niesamowite, XAML nie tak niesamowite: P – CRice

+0

Dodałem także " 'do MyControlInputBox, w przeciwnym razie kursor był zbyt wysoki. – CRice