2013-03-27 1 views
1

Я пытаюсь настроить шаблон управления для текстового поля и привязать к нему данные. Проблема в том, что данные не проходят. Я думал, так как у меня есть тег текстового поля в <ControlTemplate>, который мне нужно было как-то заполнить.Как сделать <ContentPresenter> -подобный заполнитель для текстового поля <ControlTemplate>

<Style x:Key="TextBoxStyle" TargetType="TextBox"> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="TextBox"> 
       <Grid x:Name="grid" Height="55" Background="White"> 
        <Rectangle Stroke="#FFD9D9D9" StrokeThickness="6"/> 
        <ContentPresenter x:Name="contentPresenterText" HorizontalAlignment="Center" VerticalAlignment="Center" Foreground="Black"/> 
       </Grid> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
    </Style> 

Так что я экспериментировал, добавив <ContentPresenter> тег, но это выдает ошибку.

Вот код текстового поля:

<TextBox x:Name="NameTextField" Grid.ColumnSpan="6" Grid.Column="1" TextWrapping="Wrap" Text="{Binding Name, Mode=TwoWay}" Margin="0" Style="{StaticResource TextBoxStyle}" /> 

Может кто-нибудь помочь мне понять, как это сделать. Общий шаблон, который может применяться ко всем текстовым полям, где привязка данных все еще работает?

UPDATE: Вот код, он указывает, когда происходит сбой:

#if DEBUG && !DISABLE_XAML_GENERATED_BREAK_ON_UNHANDLED_EXCEPTION 
     UnhandledException += (sender, e) => 
     { 
      if (global::System.Diagnostics.Debugger.IsAttached) global::System.Diagnostics.Debugger.Break(); //highlights this 
     }; 
#endif 

ответ

1

Во-первых, это не очень хорошая идея поставить ContentPresenter внутри TextBox.

Если вы используете контрольный шаблон, вы должны использовать привязку шаблона для привязки реальных свойств компонента. В приведенном ниже коде показано, как это можно использовать, но, насколько я помню, TextBox не обладает свойством «Content», поэтому вы можете передавать значение TextBox класса Text, Padding и т. Д., Как показано.

 <Setter Property="Template"> 
      <Setter.Value> 
       <ControlTemplate TargetType="TextBox"> 
        <Grid x:Name="RootElement"> 
         <!--TextBlock Text="{TemplateBinding Text}"/--> 
         <ContentPresenter Content="{TemplateBinding Padding}"/> 
        </Grid> 
       </ControlTemplate> 
      </Setter.Value> 
     </Setter> 

Выходной сигнал 2,2,2,2 // ContentPresenter показывает его в текстовом блоке по умолчанию.

Кроме того, вы переопределяете такие вещи, как проверка подлинности TextBox. Если вы хотите расширить возможности, которые я предлагаю переопределить стиль по умолчанию, вы можете сделать это, щелкнув правой кнопкой мыши TextBox в blend и Edit Template-> Edit a Copy, чтобы генерировать текущий шаблон для вас по состояниям TextBox,

шаблон по умолчанию это,

<Style x:Key="TextBoxStyle1" TargetType="TextBox"> 
     <Setter Property="BorderThickness" Value="1"/> 
     <Setter Property="Background" Value="#FFFFFFFF"/> 
     <Setter Property="Foreground" Value="#FF000000"/> 
     <Setter Property="Padding" Value="2"/> 
     <Setter Property="BorderBrush"> 
      <Setter.Value> 
       <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0"> 
        <GradientStop Color="#FFA3AEB9" Offset="0"/> 
        <GradientStop Color="#FF8399A9" Offset="0.375"/> 
        <GradientStop Color="#FF718597" Offset="0.375"/> 
        <GradientStop Color="#FF617584" Offset="1"/> 
       </LinearGradientBrush> 
      </Setter.Value> 
     </Setter> 
     <Setter Property="Template"> 
      <Setter.Value> 
       <ControlTemplate TargetType="TextBox"> 
        <Grid x:Name="RootElement"> 
         <VisualStateManager.VisualStateGroups> 
          <VisualStateGroup x:Name="CommonStates"> 
           <VisualState x:Name="Normal"/> 
           <VisualState x:Name="MouseOver"> 
            <Storyboard> 
             <ColorAnimation Duration="0" To="#FF99C1E2" Storyboard.TargetProperty="(Border.BorderBrush).(SolidColorBrush.Color)" Storyboard.TargetName="MouseOverBorder"/> 
            </Storyboard> 
           </VisualState> 
           <VisualState x:Name="Disabled"> 
            <Storyboard> 
             <DoubleAnimation Duration="0" To="1" Storyboard.TargetProperty="Opacity" Storyboard.TargetName="DisabledVisualElement"/> 
            </Storyboard> 
           </VisualState> 
           <VisualState x:Name="ReadOnly"> 
            <Storyboard> 
             <DoubleAnimation Duration="0" To="1" Storyboard.TargetProperty="Opacity" Storyboard.TargetName="ReadOnlyVisualElement"/> 
            </Storyboard> 
           </VisualState> 
          </VisualStateGroup> 
          <VisualStateGroup x:Name="FocusStates"> 
           <VisualState x:Name="Focused"> 
            <Storyboard> 
             <DoubleAnimation Duration="0" To="1" Storyboard.TargetProperty="Opacity" Storyboard.TargetName="FocusVisualElement"/> 
            </Storyboard> 
           </VisualState> 
           <VisualState x:Name="Unfocused"> 
            <Storyboard> 
             <DoubleAnimation Duration="0" To="0" Storyboard.TargetProperty="Opacity" Storyboard.TargetName="FocusVisualElement"/> 
            </Storyboard> 
           </VisualState> 
          </VisualStateGroup> 
          <VisualStateGroup x:Name="ValidationStates"> 
           <VisualState x:Name="Valid"/> 
           <VisualState x:Name="InvalidUnfocused"> 
            <Storyboard> 
             <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="Visibility" Storyboard.TargetName="ValidationErrorElement"> 
              <DiscreteObjectKeyFrame KeyTime="0"> 
               <DiscreteObjectKeyFrame.Value> 
                <Visibility>Visible</Visibility> 
               </DiscreteObjectKeyFrame.Value> 
              </DiscreteObjectKeyFrame> 
             </ObjectAnimationUsingKeyFrames> 
            </Storyboard> 
           </VisualState> 
           <VisualState x:Name="InvalidFocused"> 
            <Storyboard> 
             <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="Visibility" Storyboard.TargetName="ValidationErrorElement"> 
              <DiscreteObjectKeyFrame KeyTime="0"> 
               <DiscreteObjectKeyFrame.Value> 
                <Visibility>Visible</Visibility> 
               </DiscreteObjectKeyFrame.Value> 
              </DiscreteObjectKeyFrame> 
             </ObjectAnimationUsingKeyFrames> 
             <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="IsOpen" Storyboard.TargetName="validationTooltip"> 
              <DiscreteObjectKeyFrame KeyTime="0"> 
               <DiscreteObjectKeyFrame.Value> 
                <System:Boolean>True</System:Boolean> 
               </DiscreteObjectKeyFrame.Value> 
              </DiscreteObjectKeyFrame> 
             </ObjectAnimationUsingKeyFrames> 
            </Storyboard> 
           </VisualState> 
          </VisualStateGroup> 
         </VisualStateManager.VisualStateGroups> 
         <Border x:Name="Border" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" CornerRadius="1" Opacity="1"> 
          <Grid> 
           <Border x:Name="ReadOnlyVisualElement" Background="#5EC9C9C9" Opacity="0"/> 
           <Border x:Name="MouseOverBorder" BorderBrush="Transparent" BorderThickness="1"> 
            <ScrollViewer x:Name="ContentElement" BorderThickness="0" IsTabStop="False" Padding="{TemplateBinding Padding}"/> 
           </Border> 
          </Grid> 
         </Border> 
         <Border x:Name="DisabledVisualElement" BorderBrush="#A5F7F7F7" BorderThickness="{TemplateBinding BorderThickness}" Background="#A5F7F7F7" IsHitTestVisible="False" Opacity="0"/> 
         <Border x:Name="FocusVisualElement" BorderBrush="#FF6DBDD1" BorderThickness="{TemplateBinding BorderThickness}" IsHitTestVisible="False" Margin="1" Opacity="0"/> 
         <Border x:Name="ValidationErrorElement" BorderBrush="#FFDB000C" BorderThickness="1" CornerRadius="1" Visibility="Collapsed"> 
          <ToolTipService.ToolTip> 
           <ToolTip x:Name="validationTooltip" DataContext="{Binding RelativeSource={RelativeSource TemplatedParent}}" Placement="Right" PlacementTarget="{Binding RelativeSource={RelativeSource TemplatedParent}}" Template="{StaticResource ValidationToolTipTemplate}"> 
            <ToolTip.Triggers> 
             <EventTrigger RoutedEvent="Canvas.Loaded"> 
              <BeginStoryboard> 
               <Storyboard> 
                <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="IsHitTestVisible" Storyboard.TargetName="validationTooltip"> 
                 <DiscreteObjectKeyFrame KeyTime="0"> 
                  <DiscreteObjectKeyFrame.Value> 
                   <System:Boolean>true</System:Boolean> 
                  </DiscreteObjectKeyFrame.Value> 
                 </DiscreteObjectKeyFrame> 
                </ObjectAnimationUsingKeyFrames> 
               </Storyboard> 
              </BeginStoryboard> 
             </EventTrigger> 
            </ToolTip.Triggers> 
           </ToolTip> 
          </ToolTipService.ToolTip> 
          <Grid Background="Transparent" HorizontalAlignment="Right" Height="12" Margin="1,-4,-4,0" VerticalAlignment="Top" Width="12"> 
           <Path Data="M 1,0 L6,0 A 2,2 90 0 1 8,2 L8,7 z" Fill="#FFDC000C" Margin="1,3,0,0"/> 
           <Path Data="M 0,0 L2,0 L 8,6 L8,8" Fill="#ffffff" Margin="1,3,0,0"/> 
          </Grid> 
         </Border> 
        </Grid> 
       </ControlTemplate> 
      </Setter.Value> 
     </Setter> 
    </Style> 

Сложение зависит от вашего комментария:

 <ControlTemplate x:Key="TextBoxControlTemplate1" TargetType="TextBox"> 
     <Grid x:Name="grid" Background="White"> 
       <Rectangle Stroke="#FFD9D9D9" StrokeThickness="26"/> 
       <ContentPresenter x:Name="contentPresenterText" HorizontalAlignment="Center" VerticalAlignment="Center" > 
        <TextBox Text="{TemplateBinding Text}"/> 
       </ContentPresenter> 
     </Grid> 
    </ControlTemplate> 
+0

Спасибо за ваш ответ, хотя я не уверен, что я следую. В вашем примере вы использовали ContentPresenter? Я просто ищу стиль окна с короткой границей, но заметьте, что вы не можете применять стили. Я совершенно новый, очень ценю любое объяснение даже для самых простых вещей :) – dolyth

+1

ContentPresenter будет иметь смысл, когда вы привязываете что-то к свойству Content. Чтобы использовать его в ControlTemplate, ваш элемент управления должен иметь свойство Content. Так вы передаете его с помощью TemplateBinding. AFAIK TextBox не имеет такой вещи. –

+0

Хорошо, я добавляю дополнение к своему ответу, чтобы вы поняли суть –