【问题标题】:Change TextBox Template without losing classic behavior在不丢失经典行为的情况下更改文本框模板
【发布时间】:2015-09-07 10:39:36
【问题描述】:

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

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

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

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

我错过了什么吗?

@@编辑

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

【问题讨论】:

  • 请添加一些细节并显示您修改后的代码,以便更容易理解问题所在。
  • 您添加了一个边框设置为 DarkGray 的网格,这不会隐藏包含的编辑框边框吗?
  • 没有。设置为 DarkGray 的边框似乎不是问题。如果我删除边框,我将看不到我的文本框。

标签: c# wpf


【解决方案1】:

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

Blend 将复制默认模板,因此您不会丢失任何默认行为,例如选择、焦点等。 然后您可以保存一个项目,在 VS 中打开它并根据需要重构它。比如将样式移动到字典之类的。

【讨论】:

    【解决方案2】:

    您可以通过为 Border 的 GotFocus 和 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);
    }
    

    【讨论】:

    • 这是一种解决方法,但是我不能使用相同的行为,也不能使用与经典文本框相同的颜色
    • 我注意到鼠标输入时边框是浅蓝色的,但在聚焦事件上,蓝色似乎更暗一些。我能弄到那种颜色吗?
    • 我在我的电脑上看不到这种效果
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-10
    相关资源
    最近更新 更多