更改TextBox模板而不会丢失经典行为

时间:2015-09-07 10:39:36

标签: c# wpf

我创建了一个从WPF TextBox继承的自定义控件。

我的控制模板只需在文本框上添加一个小按钮,以便更快地删除文本。

但是,我注意到当我的textBox得到焦点时,它的边框不会像经典文本框那样改变(蓝色)。

我会保留原始textBox的所有方面,就像控件获得焦点时的边框一样。

我错过了什么吗?

@@ EDIT

<TextBox x:Class="XTextBox.WKTextBox"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
         xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
         mc:Ignorable="d" 
         Height="23" Width="200"
         >



<TextBox.Resources>
    <ControlTemplate x:Key="IconButton" TargetType="{x:Type ToggleButton}">
        <Border>
            <ContentPresenter />
        </Border>
    </ControlTemplate>
</TextBox.Resources>

<TextBox.Style>

    <Style TargetType="TextBox">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type TextBox}">
                    <Grid>
                        <Border BorderThickness="1" BorderBrush="DarkGray">
                            <ScrollViewer x:Name="PART_ContentHost" />
                        </Border>
                        <ToggleButton Template="{StaticResource IconButton}"
                          MaxHeight="21" 
                          Margin="-1,0,0,0" 
                          Name="imgButton" 
                          Focusable="False"
                          IsChecked="False">

                            <Image Name="imgClearText" Source="Images\x.png" Stretch="Uniform" Opacity="0.5" Visibility="Visible" HorizontalAlignment="Right"  >
                            </Image>

                        </ToggleButton>

                    </Grid>

                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>

</TextBox.Style>

2 个答案:

答案 0 :(得分:1)

不幸的是,您不能在不失去功能的情况下Replace part of default template in WPF。 我相信最简单的解决方案是下载Blend(它附带VS2015)。打开它,创建一个emty文本框并编辑其模板:

enter image description here

Blend将制作默认模板的副本,因此您不会失去任何默认行为,例如选择,焦点等。 然后你可以保存一个项目,在VS中打开它并根据需要重构它。喜欢将风格移到字典或其他东西。

答案 1 :(得分:0)

您可以通过为GotFocus&amp;添加处理程序手动获得相同的效果。边框的LostFocus事件,并设置您想要的高光颜色。

<Border BorderThickness="1" BorderBrush="DarkGray" LostFocus="Border_LostFocus" GotFocus="Border_GotFocus">

并在.cs文件中

private void Border_LostFocus(object sender, RoutedEventArgs e)
{
  ((Border)sender).BorderBrush = new SolidColorBrush(Colors.DarkGray);
}

private void Border_GotFocus(object sender, RoutedEventArgs e)
{
  ((Border)sender).BorderBrush = new SolidColorBrush(Colors.LightBlue);
}