2013-05-05 2 views
-1

Создайте приложение WPF, указав новый шаблон управления для элемента управления TextBox. Вы предоставляете пользовательский внешний вид для TextBox и реализуете функциональные возможности для изменения этого внешнего вида, когда TextBox получает фокус, теряет фокус и когда содержимое изменяется в текстовом элементе (т. Е. Событие TextChanged).ControlTemplates в WPF

Подсказка: исходное состояние должно быть по умолчанию (с вашим выбором стиля), вы можете переключаться между событиями GotFocus и LostFocus.

Это разметка, которая у меня есть до сих пор .... вместе с кодом для исправления текста. Я не могу изменить цвет фона при изменении текста текстового блока. Какие-либо предложения?

<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> 



    <ControlTemplate x:Key="myTextBoxTemplate"> 

    <Border 

    x:Name="templateBorder" 

    Padding="50" Background="Pink" 

    BorderBrush="Blue" CornerRadius="5" 

    BorderThickness="5" HorizontalAlignment="Center"> 



    <TextBlock> 

      <!--ScrollViewer all the text box to allow entering of text--> 

      <ScrollViewer Margin="0" x:Name="PART_ContentHost"> 

      </ScrollViewer> 

    </TextBlock>   

</Border> 



     <ControlTemplate.Triggers> 

      <Trigger Property="IsEnabled" Value="False"> 

       <Setter TargetName="templateBorder" Property="Background" Value="{StaticResource DisabledBackgroundBrush}"/> 

       <Setter TargetName="templateBorder" Property="BorderBrush" Value="{StaticResource DisabledBackgroundBrush}"/> 

      </Trigger> 



      <Trigger Property="IsMouseOver" Value="True"> 

       <Setter TargetName="templateBorder" Property="BorderThickness" Value="8"/> 

      </Trigger> 



      <Trigger Property="IsKeyboardFocused" Value="True"> 

       <Setter TargetName="templateBorder" Property="Background" Value="Red"/> 

      </Trigger> 





     </ControlTemplate.Triggers> 

    </ControlTemplate> 



</Window.Resources> 



<StackPanel> 



    <TextBox Text="Click Me" FontWeight="Bold" Template="{StaticResource myTextBoxTemplate}" 

      Name="myTextBox" TextChanged="myTextBox_TextChanged" Opacity="1"/> 

</StackPanel> 



</Window> 

метод:

private void myTextBox_TextChanged(object sender, TextChangedEventArgs e) 

    { 

     myTextBox.Background = Brushes.Blue; 

    } 

ответ

0

В вашей ControlTemplate вы на самом деле не используя свойства фона от TextBox. Таким образом, когда вы устанавливаете его из кода, он не действует, поскольку он не используется вашей границей ControlTemplate.

Таким образом, получите Border, чтобы использовать Background="{TemplateBinding Background}".

Что-то вроде:

<Window.Resources> 
    <ControlTemplate x:Key="myTextBoxTemplate" 
        TargetType="{x:Type TextBox}"> 
    <Border x:Name="templateBorder" 
      HorizontalAlignment="Center" 
      Background="{TemplateBinding Background}" 
      BorderBrush="{TemplateBinding BorderBrush}" 
      BorderThickness="5" 
      CornerRadius="5" 
      Padding="50"> 
     <TextBlock> 
     <ScrollViewer x:Name="PART_ContentHost" 
         Margin="0" /> 
     </TextBlock> 
    </Border> 
    <ControlTemplate.Triggers> 
     <Trigger Property="IsEnabled" 
       Value="False"> 
     <Setter TargetName="templateBorder" 
       Property="Background" 
       Value="{StaticResource DisabledBackgroundBrush}" /> 
     <Setter TargetName="templateBorder" 
       Property="BorderBrush" 
       Value="{StaticResource DisabledBackgroundBrush}" /> 
     </Trigger> 
     <Trigger Property="IsMouseOver" 
       Value="True"> 
     <Setter TargetName="templateBorder" 
       Property="BorderThickness" 
       Value="8" /> 
     </Trigger> 
     <Trigger Property="IsKeyboardFocused" 
       Value="True"> 
     <Setter TargetName="templateBorder" 
       Property="Background" 
       Value="Red" /> 
     </Trigger> 
    </ControlTemplate.Triggers> 
    </ControlTemplate> 
</Window.Resources> 
<StackPanel> 
    <TextBox Name="myTextBox" 
      FontWeight="Bold" 
      Opacity="1" 
      Template="{StaticResource myTextBoxTemplate}" 
      Text="Click Me" 
      TextChanged="myTextBox_TextChanged" /> 
    <Button Content="Dummy Button" /> 
</StackPanel>