Browse Source

use contentpresenter

Jumar Macato 5 years ago
parent
commit
88a63dde2c

+ 2 - 2
samples/ControlCatalog/Pages/TextBoxPage.xaml

@@ -44,9 +44,9 @@
         <StackPanel.Styles>
           <Style Selector="TextBox">
             <Setter Property="InnerRightContent">
-              <ControlTemplate>
+              <Template>
                 <Button Content="Clear" />
-              </ControlTemplate>
+              </Template>
             </Setter>
 
           </Style>

+ 6 - 7
src/Avalonia.Controls/TextBox.cs

@@ -13,7 +13,6 @@ using Avalonia.Metadata;
 using Avalonia.Data;
 using Avalonia.Layout;
 using Avalonia.Utilities;
-using Avalonia.Controls.Templates;
 
 namespace Avalonia.Controls
 {
@@ -96,11 +95,11 @@ namespace Avalonia.Controls
             AvaloniaProperty.RegisterDirect<TextBox, string>(nameof(NewLine),
                 textbox => textbox.NewLine, (textbox, newline) => textbox.NewLine = newline);
 
-        public static readonly StyledProperty<IControlTemplate> InnerLeftContentProperty =
-            AvaloniaProperty.Register<TextBox, IControlTemplate>(nameof(InnerLeftContent));
+        public static readonly StyledProperty<object> InnerLeftContentProperty =
+            AvaloniaProperty.Register<TextBox, object>(nameof(InnerLeftContent));
 
-        public static readonly StyledProperty<IControlTemplate> InnerRightContentProperty =
-            AvaloniaProperty.Register<TextBox, IControlTemplate>(nameof(InnerRightContent));
+        public static readonly StyledProperty<object> InnerRightContentProperty =
+            AvaloniaProperty.Register<TextBox, object>(nameof(InnerRightContent));
 
         struct UndoRedoState : IEquatable<UndoRedoState>
         {
@@ -333,13 +332,13 @@ namespace Avalonia.Controls
             set { SetValue(UseFloatingWatermarkProperty, value); }
         }
 
-        public IControlTemplate InnerLeftContent
+        public object InnerLeftContent
         {
             get { return GetValue(InnerLeftContentProperty); }
             set { SetValue(InnerLeftContentProperty, value); }
         }
 
-        public IControlTemplate InnerRightContent
+        public object InnerRightContent
         {
             get { return GetValue(InnerRightContentProperty); }
             set { SetValue(InnerRightContentProperty, value); }

+ 57 - 16
src/Avalonia.Themes.Fluent/TextBox.xaml

@@ -1,5 +1,4 @@
-<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>
@@ -9,7 +8,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}" />
@@ -19,33 +18,75 @@
         <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)}">
+                  <ScrollViewer HorizontalScrollBarVisibility="{TemplateBinding (ScrollViewer.HorizontalScrollBarVisibility)}"
+                                VerticalScrollBarVisibility="{TemplateBinding (ScrollViewer.VerticalScrollBarVisibility)}">
                     <Grid ColumnDefinitions="Auto,*,Auto">
-                      <TemplatedControl Grid.Column="0" Grid.ColumnSpan="1" Template="{TemplateBinding InnerLeftContent}"/>
+                      <ContentPresenter Grid.Column="0" Grid.ColumnSpan="1" Content="{TemplateBinding 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}"/>
+                        <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}"/>
+                        <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>
-                      <TemplatedControl Grid.Column="2" Grid.ColumnSpan="1" Template="{TemplateBinding InnerRightContent}"/>
+                      <ContentPresenter Grid.Column="0" Grid.ColumnSpan="1" Content="{TemplateBinding InnerLeftContent}"/>
                     </Grid>
                   </ScrollViewer>
                 </DataValidationErrors>