2016-03-21 3 views
1

Ich habe ein Textfeld von einem Rahmen mit abgerundeten Ecken umgeben. Sie haben beide dieselbe Hintergrundfarbe, sodass sie als einzelnes Dateneingabefeld angezeigt werden. Wenn der Benutzer in das Textfeld klickt, ändert der Hintergrund des Textfelds und der Rahmen die Farbe. Ich habe das funktioniert, wenn das Styling in meinem MainWindow ist. Ich versuche jedoch, mein gesamtes Styling vom XAML in MainWindow zu einem zentralen Ressourcenwörterbuch zu abstrahieren. Dabei finde ich, dass der DataTrigger, der die Hintergrundfarbe des Rahmens ändert, nicht funktioniert, weil ElementName nicht mehr im Bereich ist (zumindest denke ich, dass das das Problem ist). Ich habe versucht, die Dinge zu vereinfachen, indem ich dies in einem Testprojekt/einer Testlösung mache, aber ich finde nicht, dass ich einen Weg finde, den Datentrigger zum Laufen zu bringen. Ich habe einfach zwei XAML-Dateien. Einer ist mein MainWindow, der andere ist mein Ressourcenwörterbuch. Das Hauptfenster XAML ist wie folgt:Wie Elementname und Pfad auf einem DataTrigger aus einem separaten XAML-Ressourcenwörterbuch (eine andere Datei) festgelegt werden

<Window x:Class="WpfApplication1.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="MainWindow" Height="350" Width="525"> 

    <Window.Resources> 
     <ResourceDictionary Source="/MainSkins.xaml"/> 
    </Window.Resources> 

    <Grid HorizontalAlignment="Left" Width="307" Margin="83,0,0,0"> 
     <Border Style="{StaticResource AnimatedInputTextBoxBorder}"  
       Margin="10,76,10,151"> 
      <TextBox Name="txtTransitRoutingNumber" Style="{StaticResource 
        AnimatedInputTextBox}" 
        HorizontalAlignment="Left" Height="73" Margin="9,9,0,0" 
        TextWrapping="Wrap" Text="" 
        VerticalAlignment="Top" 
        Width="267"/> 
     </Border> 
    </Grid> 
</Window> 

Und hier ist meine Ressource Wörterbuch, das, wie ich oben erwähnt in einer ganz anderen Datei von MainWindow.xaml ist:

<ResourceDictionary 
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
        xmlns:local="clr-namespace:WpfApplication1"> 

    <Style x:Key="AnimatedInputTextBoxBorder" TargetType="{x:Type Border}"> 
     <Setter Property="Background" Value="#DADADA"/> 
     <Setter Property="BorderThickness" Value="1"/> 
     <Setter Property="Padding" Value="5"/> 
     <Setter Property="CornerRadius" Value="15"/> 
     <Setter Property="BorderBrush" Value="#DADADA"/> 
     <Style.Triggers> 

      <!--THIS DATA TRIGGER IS NOT WORKING--> 
      <DataTrigger Binding="{Binding Path=IsFocused}" Value="true"> 
       <Setter Property="Background" Value="#C2E4F6" /> 
       <Setter Property="BorderBrush" Value="#C2E4F6"/> 
      </DataTrigger> 
     </Style.Triggers> 
    </Style> 

    <Style x:Key="AnimatedInputTextBox" TargetType="{x:Type TextBox}"> 
     <Setter Property="Background" Value="#DADADA"/> 
     <Setter Property="Foreground" Value="#000000" /> 
     <Setter Property="BorderThickness" Value="0"/> 
     <Style.Triggers> 
      <Trigger Property="IsFocused" Value="True"> 
       <Setter Property="Background" Value="#C2E4F6"/> 
      </Trigger> 
     </Style.Triggers> 
    </Style> 

</ResourceDictionary> 

Jede Hilfe sehr geschätzt werden würde Ich bin ein Neuling, wenn es um XAML geht.

+1

Wenn ich ich wäre, hätte ich all diese Funktionalität in nur einer TextBox-Vorlage und verzichten auf die separaten Ressourcen (und separate Lookups, die daraus resultieren). –

+0

Danke Chris W. Das hat wirklich geholfen. Mit Ihrem Vorschlag konnte ich eine Arbeit finden. Ich werde meine Lösung hier veröffentlichen, damit andere sie sehen können. Danke Mike .... –

+0

Cool! Ich bin mir sicher, dass es nicht so hilfreich war wie ein Beispiel, für das ich gerne Zeit gehabt hätte, aber ich bin froh, dass du ein Heilmittel gefunden hast! –

Antwort

1

Dank Chris W., konnte ich einen Workaround finden, der gut funktioniert. Hier ist die Lösung:

<!--This style defines the animated input TextBoxes with rounded corners--> 
<Style x:Key="AnimatedTextBoxStyle" TargetType="{x:Type TextBox}"> 
    <Setter Property="Background" Value="#DADADA" /> 
    <Setter Property="BorderBrush" Value="#DADADA" /> 
    <Setter Property="BorderThickness" Value="1" /> 
    <Setter Property="FontSize" Value="14" /> 
    <Setter Property="TextAlignment" Value="Left"/> 
    <Setter Property="VerticalContentAlignment" Value="Center"/> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="{x:Type TextBoxBase}"> 
       <Border Background="{TemplateBinding Background}" 
         BorderBrush="{TemplateBinding BorderBrush}" 
         BorderThickness="{TemplateBinding BorderThickness}" CornerRadius="5"> 
         <ScrollViewer x:Name="PART_ContentHost" /> 
       </Border> 
      <ControlTemplate.Triggers> 
       <Trigger Property="IsFocused" Value="True"> 
        <Setter Property="Foreground" Value="Black" /> 
        <Setter Property="Background" Value="#C2E4F6" /> 
       </Trigger> 
      </ControlTemplate.Triggers> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 
Verwandte Themen