WPF中的ControlTemplates

时间:2013-05-05 21:32:35

标签: wpf controltemplate

通过为TextBox控件定义新的控件模板来创建WPF应用程序。您为TextBox提供自定义外观,并实现在TextBox获得焦点时更改该外观的功能,失去焦点以及文本元素中的内容更改时(即发生TextChanged事件)。

提示:初始状态应该是默认状态(可以选择样式),然后可以在GotFocus和LostFocus事件之间切换。

这是我到目前为止的标记....以及textchanged要求的代码隐藏。当我更改文本块的文本时,我无法将背景更改为蓝色。有什么建议吗?

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

    }

1 个答案:

答案 0 :(得分: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>