2016-07-18 29 views
1

Ich habe TextBoxes und FakeTextBoxes in meiner Anwendung. FakeTextBoxes fungiert als TextBoxes, aber sie haben mehr Funktionalität, da sie Knöpfe und/oder Bilder darin haben. XAML für ein FakeTextBox sieht dies so etwas wie:BorderBrush von TextBox auf BorderBrush eines Randes dynamisch anwenden

   <Border BorderThickness="1"> 
        <StackPanel Orientation="Horizontal"> 
         <TextBox BorderThickness="0" /> 
         <Button>I'm a button inside textbox</Button> 
        </StackPanel> 
       </Border> 

TextBox in meinem Projekt ein eigenes Styling haben, der seine BorderBrush ändert in Abhängigkeit von seinen IsMouseOver und GotFocus Eigenschaften. Der generische Stil kommt von mahapps.metro und Sie können es hier finden: https://github.com/MahApps/MahApps.Metro/blob/develop/MahApps.Metro/Styles/Controls.TextBox.xaml

Das Problem ist, dass ich nicht das gleiche Verhalten für die Grenze meiner FakeTextBox anwenden kann. Ich möchte das exakt gleiche Verhalten auf meiner benutzerdefinierten Border haben, so dass es genauso aussieht wie andere TextBox es.

Was ich versucht habe, und hat nicht funktioniert für Border:

  • Bindung an BorderBrush Eigentum der inneren TextBox.
  • Bindung an IsFocused Eigenschaft von TextBox: IsFocused hat keine Setter.
  • Erstellen einer versteckten TextBox und Bindung an seinen BorderBrush

Gibt es eine allgemeine und/oder einfache Lösung, um es?

+0

ist 'FakeTextBox' von' TextBox' abgeleitet?Können Sie auch den benutzerdefinierten TextBox-Stil anzeigen? – ASh

+0

Es ist nicht wirklich. Es ist nur ein Codestück in einer Ansicht/Benutzersteuerung. Hier ist der benutzerdefinierte Stil für TextBox https://github.com/MahApps/MahApps.Metro/blob/develop/MahApps.Metro/Styles/Controls.TextBox.xaml. –

+0

Können Sie uns den Code (auch Xaml) zeigen, der die FakeTextBox bildet? – Logan

Antwort

0

Ich hatte unzählige Probleme mit diesem.

Die Lösung für mich war, drei verschiedene Grenzen zu erstellen.

  • FocusBorder
  • MouseOverBorder
  • NormalBorder

FocusBorder Aufenthalte auf der Oberseite, MouseOverBorder Aufenthalte in der Mittelschicht, und NormalBorder in der untersten Ebene. Die Sichtbarkeit von FocusBorder wird durch Control.GotFocus und Control.LostFocus Ereignisauslöser bestimmt Gleiches Verhalten für den MouseOverBorder für Control.MouseEnter und Control.MouseLeave Ereignisse.

<UserControl.Triggers> 
     <EventTrigger RoutedEvent="Control.GotFocus"> 
      <BeginStoryboard> 
       <Storyboard> 
        <ObjectAnimationUsingKeyFrames 
             Storyboard.TargetName="FocusBorder" 
             Storyboard.TargetProperty="Visibility" 
             Duration="1"> 
         <DiscreteObjectKeyFrame KeyTime="0"> 
          <DiscreteObjectKeyFrame.Value> 
           <Visibility>Visible</Visibility> 
          </DiscreteObjectKeyFrame.Value> 
         </DiscreteObjectKeyFrame> 
        </ObjectAnimationUsingKeyFrames> 
       </Storyboard> 
      </BeginStoryboard> 
     </EventTrigger> 
     <EventTrigger RoutedEvent="Control.LostFocus"> 
      <BeginStoryboard> 
       <Storyboard> 
        <ObjectAnimationUsingKeyFrames 
             Storyboard.TargetName="FocusBorder" 
             Storyboard.TargetProperty="Visibility" 
             Duration="1"> 
         <DiscreteObjectKeyFrame KeyTime="0"> 
          <DiscreteObjectKeyFrame.Value> 
           <Visibility>Collapsed</Visibility> 
          </DiscreteObjectKeyFrame.Value> 
         </DiscreteObjectKeyFrame> 
        </ObjectAnimationUsingKeyFrames> 
       </Storyboard> 
      </BeginStoryboard> 
     </EventTrigger> 
     <EventTrigger RoutedEvent="Control.MouseEnter"> 
      <BeginStoryboard> 
       <Storyboard> 
        <ObjectAnimationUsingKeyFrames 
             Storyboard.TargetName="MouseOverBorder" 
             Storyboard.TargetProperty="Visibility" 
             Duration="1"> 
         <DiscreteObjectKeyFrame KeyTime="0"> 
          <DiscreteObjectKeyFrame.Value> 
           <Visibility>Visible</Visibility> 
          </DiscreteObjectKeyFrame.Value> 
         </DiscreteObjectKeyFrame> 
        </ObjectAnimationUsingKeyFrames> 
       </Storyboard> 
      </BeginStoryboard> 
     </EventTrigger> 
     <EventTrigger RoutedEvent="Control.MouseLeave"> 
      <BeginStoryboard> 
       <Storyboard> 
        <ObjectAnimationUsingKeyFrames 
             Storyboard.TargetName="MouseOverBorder" 
             Storyboard.TargetProperty="Visibility" 
             Duration="1"> 
         <DiscreteObjectKeyFrame KeyTime="0"> 
          <DiscreteObjectKeyFrame.Value> 
           <Visibility>Collapsed</Visibility> 
          </DiscreteObjectKeyFrame.Value> 
         </DiscreteObjectKeyFrame> 
        </ObjectAnimationUsingKeyFrames> 
       </Storyboard> 
      </BeginStoryboard> 
     </EventTrigger> 
    </UserControl.Triggers> 
    <Grid> 
     <Border x:Name="FocusBorder" BorderBrush="{DynamicResource ComboBoxMouseOverInnerBorderBrush}" 
       Canvas.ZIndex="3" BorderThickness="1" Visibility="Collapsed" /> 
     <Border x:Name="MouseOverBorder" BorderBrush="{DynamicResource TextBoxMouseOverBorderBrush}" 
       Canvas.ZIndex="2" BorderThickness="1" Visibility="Collapsed" /> 
     <Border BorderBrush="{DynamicResource TextBoxBorderBrush}" 
       Canvas.ZIndex="1" BorderThickness="1" /> 
     <TextBox BorderThickness="0"></TextBox> 
    </Grid> 
2

Da Sie das Border-Verhalten kopieren möchten, suchen Sie nach BorderBrushes in der TextBox Style de, wie sie implementiert sind. Drei gefunden, um ihre Schlüssel einen Besuch in der Colors Abschnitt zu bekommen.

<Border BorderThickness="1"> 
    <Border.Resources> 
     <Color x:Key="BlackColor">#FF000000</Color> 
     <Color x:Key="Gray2">#FF7F7F7F</Color> 
     <Color x:Key="Gray6">#FFCCCCCC</Color> 
     <SolidColorBrush x:Key="TextBoxBorderBrush" Color="{StaticResource Gray6}" /> 
     <SolidColorBrush x:Key="TextBoxMouseOverBorderBrush" Color="{StaticResource Gray2}" /> 
     <SolidColorBrush x:Key="TextBoxFocusBorderBrush" Color="{StaticResource BlackColor}" /> 
    </Border.Resources> 
    <Border.Style> 
     <Style TargetType="{x:Type Border}"> 
      <Setter Property="BorderBrush" Value="{StaticResource TextBoxBorderBrush}" /> 
      <Style.Triggers> 
       <Trigger Property="IsMouseOver" Value="True"> 
        <Setter Property="BorderBrush" Value="{StaticResource TextBoxMouseOverBorderBrush}" /> 
       </Trigger> 
       <EventTrigger RoutedEvent="Control.GotFocus"> 
        <BeginStoryboard> 
         <Storyboard> 
          <ColorAnimation Storyboard.TargetProperty="BorderBrush.Color" To="White" Duration="0:0:0.250"/> 
         </Storyboard> 
        </BeginStoryboard> 
       </EventTrigger> 
      </Style.Triggers> 
     </Style> 
    </Border.Style> 
    <StackPanel> 
     <TextBox BorderThickness="0" /> 
     <Button>I'm a button inside textbox</Button> 
    </StackPanel> 
</Border> 

Die IsFocused BorderBrush ist schwierig, weil es die IsFocused Eigenschaft des TextBox ist sind Sie nach. Wenn Sie es richtig machen, möchten Sie einen Attached Property IsFocused auf den Border deklarieren und ihn an den IsFocused des TextBoxes binden oder ihn zu einem Custom Border machen.

+0

Danke Funk, ich denke, ich werde für diesen Weg gehen. Nur eine Frage, damit das auch mit anderen Themen funktioniert: Ich ändere 'To =" White "' zu 'To =" {StaticResource BlackColor} "' es funktioniert nicht. 'BlackColor' ist jedoch in' MahApps' definiert: \. Irgendwelche Ideen? ** Bearbeiten: ** Ich habe gerade festgestellt, dass dieser Code die Farbe jedes einzelnen Rahmens in der WPF-Ansicht ändert, obwohl ich nur den Rand der 'FakeTextBox' ändern möchte. –

+0

@ U.Bulle Gern geschehen. Der Style wird nur auf den äußeren Rand angewendet. Damit ein Style auf alle Instanzen angewendet werden kann, müsste er in Ressourcen deklariert werden. Was passiert, ist, dass die Schlüssel der Farben in Border.Resources überschrieben werden. Sie können sie nacheinander aussuchen und sehen, was passiert. – Funk