Browse Source

add InnerLeftContent and InnerRightContent

Jumar Macato 5 years ago
parent
commit
1af661666a
2 changed files with 39 additions and 59 deletions
  1. 18 0
      src/Avalonia.Controls/TextBox.cs
  2. 21 59
      src/Avalonia.Themes.Fluent/TextBox.xaml

+ 18 - 0
src/Avalonia.Controls/TextBox.cs

@@ -95,6 +95,12 @@ namespace Avalonia.Controls
             AvaloniaProperty.RegisterDirect<TextBox, string>(nameof(NewLine),
                 textbox => textbox.NewLine, (textbox, newline) => textbox.NewLine = newline);
 
+        public static readonly StyledProperty<object> InnerLeftContentProperty =
+            AvaloniaProperty.Register<TextBox, object>(nameof(InnerLeftContent));
+
+        public static readonly StyledProperty<object> InnerRightContentProperty =
+            AvaloniaProperty.Register<TextBox, object>(nameof(InnerRightContent));
+
         struct UndoRedoState : IEquatable<UndoRedoState>
         {
             public string Text { get; }
@@ -326,6 +332,18 @@ namespace Avalonia.Controls
             set { SetValue(UseFloatingWatermarkProperty, value); }
         }
 
+        public object InnerLeftContent
+        {
+            get { return GetValue(InnerLeftContentProperty); }
+            set { SetValue(InnerLeftContentProperty, value); }
+        }
+
+        public object InnerRightContent
+        {
+            get { return GetValue(InnerRightContentProperty); }
+            set { SetValue(InnerRightContentProperty, value); }
+        }
+
         public TextWrapping TextWrapping
         {
             get { return GetValue(TextWrappingProperty); }

+ 21 - 59
src/Avalonia.Themes.Fluent/TextBox.xaml

@@ -1,4 +1,5 @@
-<Styles xmlns="https://github.com/avaloniaui" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
+<Styles xmlns="https://github.com/avaloniaui"
+  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
   <Styles.Resources>
     <Thickness x:Key="TextBoxTopHeaderMargin">0,0,0,4</Thickness>
   </Styles.Resources>
@@ -8,7 +9,7 @@
     <Setter Property="CaretBrush" Value="{DynamicResource TextControlForeground}" />
     <Setter Property="BorderBrush" Value="{DynamicResource TextControlBorderBrush}" />
     <Setter Property="SelectionBrush" Value="{DynamicResource TextControlSelectionHighlightColor}" />
-    <Setter Property="BorderThickness" Value="{DynamicResource TextControlBorderThemeThickness}" />    
+    <Setter Property="BorderThickness" Value="{DynamicResource TextControlBorderThemeThickness}" />
     <Setter Property="FontSize" Value="{DynamicResource ControlContentThemeFontSize}" />
     <Setter Property="MinHeight" Value="{DynamicResource TextControlThemeMinHeight}" />
     <Setter Property="MinWidth" Value="{DynamicResource TextControlThemeMinWidth}" />
@@ -18,73 +19,34 @@
         <DockPanel>
 
           <!-- TODO bind Content -> Header and ContentTemplate -> HeaderTemplate -->
-          <ContentPresenter x:Name="HeaderContentPresenter"
-                            DockPanel.Dock="Top"
-                            TextBlock.FontWeight="Normal"
-                            TextBlock.Foreground="{DynamicResource TextControlHeaderForeground}"
-                            IsVisible="False"
-                            Margin="{DynamicResource TextBoxTopHeaderMargin}" />
+          <ContentPresenter x:Name="HeaderContentPresenter" DockPanel.Dock="Top" TextBlock.FontWeight="Normal" TextBlock.Foreground="{DynamicResource TextControlHeaderForeground}" IsVisible="False" Margin="{DynamicResource TextBoxTopHeaderMargin}" />
 
           <Panel>
-            <Border
-              Name="border"
-              Background="{TemplateBinding Background}"
-              BorderBrush="{TemplateBinding BorderBrush}"
-              BorderThickness="{TemplateBinding BorderThickness}"
-              CornerRadius="{DynamicResource ControlCornerRadius}"
-              MinWidth="{TemplateBinding MinWidth}"
-              MinHeight="{TemplateBinding MinHeight}">
+            <Border Name="border" Background="{TemplateBinding Background}" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" CornerRadius="{DynamicResource ControlCornerRadius}" MinWidth="{TemplateBinding MinWidth}" MinHeight="{TemplateBinding MinHeight}">
             </Border>
 
-            <Border
-              Padding="{TemplateBinding Padding}"
-              Margin="{TemplateBinding BorderThickness}">
+            <Border Padding="{TemplateBinding Padding}" Margin="{TemplateBinding BorderThickness}">
               <DockPanel>
-                <TextBlock Name="floatingWatermark"
-                           Foreground="{DynamicResource SystemAccentColor}"
-                           FontSize="{DynamicResource FontSizeSmall}"
-                           Text="{TemplateBinding Watermark}"
-                           DockPanel.Dock="Top">
+                <TextBlock Name="floatingWatermark" Foreground="{DynamicResource SystemAccentColor}" FontSize="{DynamicResource FontSizeSmall}" Text="{TemplateBinding Watermark}" DockPanel.Dock="Top">
                   <TextBlock.IsVisible>
-                      <MultiBinding Converter="{x:Static BoolConverters.And}">
-                        <Binding RelativeSource="{RelativeSource TemplatedParent}"
-                               Path="UseFloatingWatermark"/>
-                        <Binding RelativeSource="{RelativeSource TemplatedParent}"
-                               Path="Text"
-                               Converter="{x:Static StringConverters.IsNotNullOrEmpty}"/>
-                      </MultiBinding>
+                    <MultiBinding Converter="{x:Static BoolConverters.And}">
+                      <Binding RelativeSource="{RelativeSource TemplatedParent}" Path="UseFloatingWatermark"/>
+                      <Binding RelativeSource="{RelativeSource TemplatedParent}" Path="Text" Converter="{x:Static StringConverters.IsNotNullOrEmpty}"/>
+                    </MultiBinding>
                   </TextBlock.IsVisible>
                 </TextBlock>
 
                 <DataValidationErrors>
-                  <ScrollViewer HorizontalScrollBarVisibility="{TemplateBinding (ScrollViewer.HorizontalScrollBarVisibility)}"
-                                VerticalScrollBarVisibility="{TemplateBinding (ScrollViewer.VerticalScrollBarVisibility)}">
-
-                    <Panel>
-                      <TextBlock Name="watermark"
-                               Opacity="0.5"
-                               Text="{TemplateBinding Watermark}"
-                               TextAlignment="{TemplateBinding TextAlignment}"
-                               TextWrapping="{TemplateBinding TextWrapping}"
-                               IsVisible="{TemplateBinding Text, Converter={x:Static StringConverters.IsNullOrEmpty}}"
-                               HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" 
-                               VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/>
-                      <!-- TODO eliminate this margin... text layout issue? -->
-                      <TextPresenter Name="PART_TextPresenter"
-                                   Margin="0 1 0 0"
-                                   Text="{TemplateBinding Text, Mode=TwoWay}"
-                                   CaretIndex="{TemplateBinding CaretIndex}"
-                                   SelectionStart="{TemplateBinding SelectionStart}"
-                                   SelectionEnd="{TemplateBinding SelectionEnd}"
-                                   TextAlignment="{TemplateBinding TextAlignment}"
-                                   TextWrapping="{TemplateBinding TextWrapping}"
-                                   PasswordChar="{TemplateBinding PasswordChar}"
-                                   SelectionBrush="{TemplateBinding SelectionBrush}"
-                                   SelectionForegroundBrush="{TemplateBinding SelectionForegroundBrush}"
-                                   CaretBrush="{TemplateBinding CaretBrush}"
-                                   HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" 
-                                   VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/> 
-                    </Panel>
+                  <ScrollViewer HorizontalScrollBarVisibility="{TemplateBinding (ScrollViewer.HorizontalScrollBarVisibility)}" VerticalScrollBarVisibility="{TemplateBinding (ScrollViewer.VerticalScrollBarVisibility)}">
+                    <Grid ColumnDefinition="Auto,*,Auto">
+                      <ContentPresenter Grid.Column="0" Grid.ColumnSpan="1" Content="{Binding InnerLeftContent}"/>
+                      <Panel Grid.Column="1" Grid.ColumnSpan="1">
+                        <TextBlock Name="watermark" Opacity="0.5" Text="{TemplateBinding Watermark}" TextAlignment="{TemplateBinding TextAlignment}" TextWrapping="{TemplateBinding TextWrapping}" IsVisible="{TemplateBinding Text, Converter={x:Static StringConverters.IsNullOrEmpty}}" HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/>
+                        <!-- TODO eliminate this margin... text layout issue? -->
+                        <TextPresenter Name="PART_TextPresenter" Margin="0 1 0 0" Text="{TemplateBinding Text, Mode=TwoWay}" CaretIndex="{TemplateBinding CaretIndex}" SelectionStart="{TemplateBinding SelectionStart}" SelectionEnd="{TemplateBinding SelectionEnd}" TextAlignment="{TemplateBinding TextAlignment}" TextWrapping="{TemplateBinding TextWrapping}" PasswordChar="{TemplateBinding PasswordChar}" SelectionBrush="{TemplateBinding SelectionBrush}" SelectionForegroundBrush="{TemplateBinding SelectionForegroundBrush}" CaretBrush="{TemplateBinding CaretBrush}" HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/>
+                      </Panel>
+                      <ContentPresenter Grid.Column="2" Grid.ColumnSpan="1" Content="{Binding InnerRightContent}"/>
+                    </Grid>
                   </ScrollViewer>
                 </DataValidationErrors>
               </DockPanel>