Как изменить цвет границы textbox wpf

I am trying to make a search TextBox with an embedded magnifying glass icon. I have the following markup so far: <Border DockPanel.Dock="Bottom" Margin="2,4,0,4" BorderThickness="1"

I am trying to make a search TextBox with an embedded magnifying glass icon. I have the following markup so far:

<Border DockPanel.Dock="Bottom" Margin="2,4,0,4" 
        BorderThickness="1" SnapsToDevicePixels="True" 
        BorderBrush="{DynamicResource {x:Static SystemColors.ControlDarkBrushKey}}">
    <DockPanel>
        <StackPanel Orientation="Horizontal" DockPanel.Dock="Right">
            <Image Source="/Resources/search-13x13.png" Width="13"/>
        </StackPanel>
        <TextBox Name="searchTextBox" DockPanel.Dock="Bottom" BorderThickness="0" 
                 Text="{Binding FilterText, UpdateSourceTrigger=PropertyChanged}"/>
    </DockPanel>
</Border>

However, I can’t find the entry in SystemColors which will give me the same color as the standard TextBox border. This is a blueish color by default. Am I being really stupid here?!?

EDIT: btw, the image is contained in a stackpanel because I’m planning to put a dropdown arrow in there as well.

Kjartan's user avatar

Kjartan

18.4k15 gold badges73 silver badges93 bronze badges

asked Jun 5, 2009 at 12:27

Grokys's user avatar

3

You might try using Microsoft.Windows.Themes.ListBoxChrome instead of the Border; that’s what the default template for TextBox uses:

<ControlTemplate TargetType="TextBoxBase" 
                 xmlns:mwt="clr-namespace:Microsoft.Windows.Themes;assembly=PresentationFramework.Aero">
    <mwt:ListBoxChrome Name="Bd" SnapsToDevicePixels="True">
        <ScrollViewer Name="PART_ContentHost" 
                      SnapsToDevicePixels="{TemplateBinding UIElement.SnapsToDevicePixels}" />
    </mwt:ListBoxChrome>
    <ControlTemplate.Triggers>
        <Trigger Property="UIElement.IsEnabled" Value="False">
            <Setter TargetName="Bd" Property="Panel.Background" 
                    Value="{DynamicResource {x:Static SystemColors.ControlBrushKey}}" />
            <Setter Property="TextElement.Foreground" 
                    Value="{DynamicResource {x:Static SystemColors.ControlBrushKey}}"/>
        </Trigger>
    </ControlTemplate.Triggers>
</ControlTemplate>

You should be able to use just ListBoxChrome instead of Border rather than re-templating TextBox to match the code you presented.

answered Jun 5, 2009 at 13:27

Nicholas Armstrong's user avatar

3

I was able to get it programatically with:

TextBox.BorderBrush = SystemColors.ControlDarkBrush;

answered Jan 14, 2010 at 23:52

baron's user avatar

baronbaron

10.9k20 gold badges54 silver badges88 bronze badges

1

Based on Nicholas Armstrong’s answer, that solution is working for me:

<Style TargetType="{x:Type local:CustomTextBox}" BasedOn="{StaticResource {x:Type TextBox}}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type local:CustomTextBox}">
                <mwt:ListBoxChrome x:Name="Bd" SnapsToDevicePixels="true" Background="{TemplateBinding Background}" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" RenderFocused="{TemplateBinding IsKeyboardFocusWithin}" RenderMouseOver="{TemplateBinding IsMouseOver}">
                        <ScrollViewer x:Name="PART_ContentHost" />
                </mwt:ListBoxChrome>
                <ControlTemplate.Triggers>
                    <Trigger Property="IsEnabled" Value="false">
                        <Setter Property="Background" TargetName="Bd" Value="{DynamicResource {x:Static SystemColors.ControlBrushKey}}"/>
                        <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.GrayTextBrushKey}}"/>
                    </Trigger>
                </ControlTemplate.Triggers>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

answered May 25, 2012 at 9:36

dwonisch's user avatar

dwonischdwonisch

5,4512 gold badges29 silver badges43 bronze badges

It seems hackish, but I’ve had the best luck by creating a textbox (perhaps collapsed) and binding to its border brush.

answered Mar 17, 2011 at 17:52

Greg D's user avatar

Greg DGreg D

42.8k14 gold badges84 silver badges116 bronze badges

  • Remove From My Forums
  • Question

  • Setting TextBox.BorderBrush only affects the idle state. The default color pops back up on mouseover. How is that customizeable? Write my own event handler? Then what about all the other events, like getting focus, or being selected? Where is the default behavior of a TextBox documented?

Answers

  • Looks like TextBox is doing something funcky here.  I played around a bit and found that if you set the BorderThickness to something other than 1 (.99 or 1.01 for instance) you no longer have your problem.  I will check around to see if this is a known bug or not.

    For you general question of dealing with the appearance of your control under certain conditions, you can use visual triggers in your style.  Something like:

    <Page
            xmlns=»http://schemas.microsoft.com/winfx/2006/xaml/presentation»
            xmlns:x=»http://schemas.microsoft.com/winfx/2006/xaml»       
            x:Name=»Window»> 
        <Page.Resources>
            <Style TargetType=»{x:Type TextBox}»>
                <Style.Triggers>
                            <Trigger Property=»TextBox.IsMouseOver» Value=»True»>
                                    <Setter Property=»BorderBrush» Value=»Green» />
             <Setter Property=»BorderThickness» Value=»4″ />                             
                            </Trigger>
            <Trigger Property=»TextBox.IsMouseOver» Value=»False»>
                                    <Setter Property=»BorderBrush» Value=»Red» />
             <Setter Property=»BorderThickness» Value=»4″ />                             
                            </Trigger>                      
                </Style.Triggers>
            </Style>       
        </Page.Resources>
        <TextBox Width=»300″ Height=»50″/>    
    </Page>

Post Views: 6,837

WPF Textbox Style – Changing Colors on Focus.

Using the WPF Textbox styles options, we can change the border color, foreground color, background color, border color and also produce a rounded border radius for WPF Textbox control.

In this post I’ll explaining a very simple WPF Textbox style using which you can change the Foreground and the border color of your WPF Textbox.

The Style code for WPF Textbox:


<Style TargetType="TextBox">
<Setter Property="Padding" Value="5"/>
<Setter Property="Margin" Value="5"/>
<Setter Property="FontSize" Value="20"/>
<Setter Property="MinHeight" Value="20"/>
<Setter Property="MinWidth" Value="250"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type TextBox}">
<Border x:Name="border"
CornerRadius="2"
BorderBrush="#000"
BorderThickness="1"
Background="#fff"
>
<ScrollViewer x:Name="PART_ContentHost"
Focusable="false"
HorizontalScrollBarVisibility="Hidden"
VerticalScrollBarVisibility="Hidden"/>
</Border>
<ControlTemplate.Triggers>
<Trigger Property="IsMouseOver" Value="true">
<Setter Property="BorderBrush" TargetName="border" Value="#909090"/>
<Setter Property="Foreground" Value="Red" />
<Setter Property="FontWeight" Value="Bold" />
</Trigger>
<Trigger Property="IsFocused" Value="true">
<Setter Property="Foreground" Value="Blue" />
<Setter Property="BorderBrush" TargetName="border" Value="Blue"/>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>


And my WPF Textbox :


<StackPanel Orientation="Horizontal" VerticalAlignment="Top">
<TextBlock FontSize="20" Margin="5" VerticalAlignment="Center">First name :</TextBlock>
<TextBox Name="btnName" ></TextBox>
</StackPanel>
<StackPanel Orientation="Horizontal" VerticalAlignment="Top">
<TextBlock FontSize="20" Margin="5" VerticalAlignment="Center">Last name :</TextBlock>
<TextBox Name="btnLastName" ></TextBox>
</StackPanel>

Below is the full code with style :


<Window x:Class="WpfApplication2.Form1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Form1" Height="300" Width="300" WindowState='Maximized'>
<Window.Resources>
<Style TargetType="TextBox">
<Setter Property="Padding" Value="5"/>
<Setter Property="Margin" Value="5"/>
<Setter Property="FontSize" Value="20"/>
<Setter Property="MinHeight" Value="20"/>
<Setter Property="MinWidth" Value="250"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type TextBox}">
<Border x:Name="border"
CornerRadius="2"
BorderBrush="#000"
BorderThickness="1"
Background="#fff"

>
<ScrollViewer x:Name="PART_ContentHost"
Focusable="false"
HorizontalScrollBarVisibility="Hidden"
VerticalScrollBarVisibility="Hidden"/>
</Border>
<ControlTemplate.Triggers>
<Trigger Property="IsMouseOver" Value="true">
<Setter Property="BorderBrush" TargetName="border" Value="#909090"/>
<Setter Property="Foreground" Value="Red" />
<Setter Property="FontWeight" Value="Bold" />
</Trigger>
<Trigger Property="IsFocused" Value="true">
<Setter Property="Foreground" Value="Blue" />
<Setter Property="BorderBrush" TargetName="border" Value="Blue"/>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>

</Window.Resources>
<StackPanel Orientation="Vertical" VerticalAlignment="Top">

<StackPanel Orientation="Horizontal" VerticalAlignment="Top">
<TextBlock FontSize="20" Margin="5" VerticalAlignment="Center">First name :</TextBlock>
<TextBox Name="btnName" ></TextBox>
</StackPanel>
<StackPanel Orientation="Horizontal" VerticalAlignment="Top">
<TextBlock FontSize="20" Margin="5" VerticalAlignment="Center">Last name :</TextBlock>
<TextBox Name="btnLastName" ></TextBox>
</StackPanel>
</StackPanel>
</Window>

Now run your program, you will get the styled WPF Textbox control with on focus changing foreground color, border color, rounded corners textbox.

Also see :
WPF Button Style with Rounded Corners and Hover Effects
WPF Textbox With Rounded Corners

Рейтинг: 4.00. Голосов: 1.

Запись от Элд Хасп размещена 24.11.2018 в 09:13

Обновил(-а) Элд Хасп 07.12.2018 в 10:50
(Изменение категории)


Решение по вопросам тем TextBox запретить изменение цвета BorderBrush, Убрать рамочку вокруг textbox
Вопрос в том, как поменять цвет рамки или убрать рамку TextBox при фокусировке. В невыделанном состоянии для рамки используется кисть из свойства TextBox.BorderBrush. Но при выделении (Focus или MouseOver) используемые кисти недоступны.
Есть несколько способов решения этого вопроса. В основном предлагается переопределение шаблона с использование триггеров.
Я предлагаю внесением изменений в дефолтный шаблон сделать доступными для изменения кисти для рамок.

Рассмотрим дефолтный шаблон TextBox

Кликните здесь для просмотра всего текста

XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
    <Window.Resources>
        <SolidColorBrush x:Key="TextBox.Static.Border" Color="#FFABAdB3"/>
        <SolidColorBrush x:Key="TextBox.MouseOver.Border" Color="#FF7EB4EA"/>
        <SolidColorBrush x:Key="TextBox.Focus.Border" Color="#FF569DE5"/>
        <Style TargetType="{x:Type TextBox}">
            <Setter Property="Background" Value="{DynamicResource {x:Static SystemColors.WindowBrushKey}}"/>
            <Setter Property="BorderBrush" Value="{StaticResource TextBox.Static.Border}"/>
            <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}"/>
            <Setter Property="BorderThickness" Value="1"/>
            <Setter Property="KeyboardNavigation.TabNavigation" Value="None"/>
            <Setter Property="HorizontalContentAlignment" Value="Left"/>
            <Setter Property="FocusVisualStyle" Value="{x:Null}"/>
            <Setter Property="AllowDrop" Value="true"/>
            <Setter Property="ScrollViewer.PanningMode" Value="VerticalFirst"/>
            <Setter Property="Stylus.IsFlicksEnabled" Value="False"/>
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="{x:Type TextBox}">
                        <Border x:Name="border" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" SnapsToDevicePixels="True">
                            <ScrollViewer x:Name="PART_ContentHost" Focusable="false" HorizontalScrollBarVisibility="Hidden" VerticalScrollBarVisibility="Hidden"/>
                        </Border>
                        <ControlTemplate.Triggers>
                            <Trigger Property="IsEnabled" Value="false">
                                <Setter Property="Opacity" TargetName="border" Value="0.56"/>
                            </Trigger>
                            <Trigger Property="IsMouseOver" Value="true">
                                <Setter Property="BorderBrush" TargetName="border" Value="{StaticResource TextBox.MouseOver.Border}"/>
                            </Trigger>
                            <Trigger Property="IsKeyboardFocused" Value="true">
                                <Setter Property="BorderBrush" TargetName="border" Value="{StaticResource TextBox.Focus.Border}"/>
                            </Trigger>
                        </ControlTemplate.Triggers>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
            <Style.Triggers>
                <MultiTrigger>
                    <MultiTrigger.Conditions>
                        <Condition Property="IsInactiveSelectionHighlightEnabled" Value="true"/>
                        <Condition Property="IsSelectionActive" Value="false"/>
                    </MultiTrigger.Conditions>
                    <Setter Property="SelectionBrush" Value="{DynamicResource {x:Static SystemColors.InactiveSelectionHighlightBrushKey}}"/>
                </MultiTrigger>
            </Style.Triggers>
        </Style>
    </Window.Resources>

Рамку при наведении мыши определяют теги 26-28 строк, клавиатуры — строки 29-31. Цвет рамки для мыши определяет ресурс TextBox.MouseOver.Border, клавиатуры — TextBox.Focus.Border. Обе привязки к ресурсу статические — то есть, после инициализации шаблона их изменить нельзя.
Что бы стало возможно в определении TextBox менять эти ресурсы, изменим привязки на динамические

XML
26
27
28
29
30
31
                            <Trigger Property="IsMouseOver" Value="true">
                                <Setter Property="BorderBrush" TargetName="border" Value="{DynamicResource TextBox.MouseOver.Border}"/>
                            </Trigger>
                            <Trigger Property="IsKeyboardFocused" Value="true">
                                <Setter Property="BorderBrush" TargetName="border" Value="{DynamicResource TextBox.Focus.Border}"/>
                            </Trigger>

Теперь мы можем устанавливать цвет рамки для любого режима. Если какая-то рамка не нужна, надо установить её цвет «Transparent«. В примере устанавливаются цвета: для обычного состояния — Green, при наведении мыши — Red, при клавиатурном фокусе — Yellow

XML
1
2
3
4
5
6
        <TextBox VerticalAlignment="Center" HorizontalAlignment="Center" BorderBrush="Green" Text="Пример текста">
            <TextBox.Resources>
                <SolidColorBrush x:Key="TextBox.MouseOver.Border" Color="Red"/>
                <SolidColorBrush x:Key="TextBox.Focus.Border" Color="Yellow"/>
            </TextBox.Resources>
        </TextBox>

Сам переопределённый шаблон и сопутствующие ресурсы лучше прописать в словаре, чтобы не загромождать Xaml окна. Словарь, в зависимости от необходимости, подключить на уровне окна или приложения.
Ниже полный Xaml примера с определением шаблона в ресурсах окна и двумя TextBox — один без рамок.

XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
<Window x:Class="Cs_WPF.TextBoxTemplate__1513854_2351583_"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:Cs_WPF"
        mc:Ignorable="d"
        Title="TextBoxTemplate__1513854_2351583_" Height="204" Width="371" FontSize="20">
    <Window.Resources>
        <SolidColorBrush x:Key="TextBox.Static.Border" Color="#FFABAdB3"/>
        <SolidColorBrush x:Key="TextBox.MouseOver.Border" Color="#FF7EB4EA"/>
        <SolidColorBrush x:Key="TextBox.Focus.Border" Color="#FF569DE5"/>
        <Style TargetType="{x:Type TextBox}">
            <Setter Property="Background" Value="{DynamicResource {x:Static SystemColors.WindowBrushKey}}"/>
            <Setter Property="BorderBrush" Value="{StaticResource TextBox.Static.Border}"/>
            <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}"/>
            <Setter Property="BorderThickness" Value="1"/>
            <Setter Property="KeyboardNavigation.TabNavigation" Value="None"/>
            <Setter Property="HorizontalContentAlignment" Value="Left"/>
            <Setter Property="FocusVisualStyle" Value="{x:Null}"/>
            <Setter Property="AllowDrop" Value="true"/>
            <Setter Property="ScrollViewer.PanningMode" Value="VerticalFirst"/>
            <Setter Property="Stylus.IsFlicksEnabled" Value="False"/>
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="{x:Type TextBox}">
                        <Border x:Name="border" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" SnapsToDevicePixels="True">
                            <ScrollViewer x:Name="PART_ContentHost" Focusable="false" HorizontalScrollBarVisibility="Hidden" VerticalScrollBarVisibility="Hidden"/>
                        </Border>
                        <ControlTemplate.Triggers>
                            <Trigger Property="IsEnabled" Value="false">
                                <Setter Property="Opacity" TargetName="border" Value="0.56"/>
                            </Trigger>
                            <Trigger Property="IsMouseOver" Value="true">
                                <Setter Property="BorderBrush" TargetName="border" Value="{DynamicResource TextBox.MouseOver.Border}"/>
                            </Trigger>
                            <Trigger Property="IsKeyboardFocused" Value="true">
                                <Setter Property="BorderBrush" TargetName="border" Value="{DynamicResource TextBox.Focus.Border}"/>
                            </Trigger>
                        </ControlTemplate.Triggers>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
            <Style.Triggers>
                <MultiTrigger>
                    <MultiTrigger.Conditions>
                        <Condition Property="IsInactiveSelectionHighlightEnabled" Value="true"/>
                        <Condition Property="IsSelectionActive" Value="false"/>
                    </MultiTrigger.Conditions>
                    <Setter Property="SelectionBrush" Value="{DynamicResource {x:Static SystemColors.InactiveSelectionHighlightBrushKey}}"/>
                </MultiTrigger>
            </Style.Triggers>
        </Style>
    </Window.Resources>
    <Grid>
        <TextBox VerticalAlignment="Top" HorizontalAlignment="Center" BorderBrush="Green" Text="Пример текста">
            <TextBox.Resources>
                <SolidColorBrush x:Key="TextBox.MouseOver.Border" Color="Red"/>
                <SolidColorBrush x:Key="TextBox.Focus.Border" Color="Yellow"/>
            </TextBox.Resources>
        </TextBox>
        <TextBox VerticalAlignment="Center" HorizontalAlignment="Center" BorderBrush="Transparent" Text="Пример текста">
            <TextBox.Resources>
                <SolidColorBrush x:Key="TextBox.MouseOver.Border" Color="Transparent"/>
                <SolidColorBrush x:Key="TextBox.Focus.Border" Color="Transparent"/>
            </TextBox.Resources>
        </TextBox>
       <Button VerticalAlignment="Bottom" HorizontalAlignment="Center">Кнопка</Button>
    </Grid>
</Window>

Всего комментариев

You can change the border displayed around a TextBox using the BorderBrush and BorderThickness properties.

In the example below, we use a trigger to change the border of the TextBox that has focus.

    <Window.Resources>
        <Style TargetType="{x:Type TextBox}">
            <Setter Property="Template">
                <Setter.Value>
                    <!-- Modify default template, to change triggers -->
                    <ControlTemplate TargetType="{x:Type TextBoxBase}">
                        <Border x:Name="border" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" SnapsToDevicePixels="True">
                            <ScrollViewer x:Name="PART_ContentHost" Focusable="False" HorizontalScrollBarVisibility="Hidden" VerticalScrollBarVisibility="Hidden"/>
                        </Border>
                        <ControlTemplate.Triggers>
                            <Trigger Property="IsEnabled" Value="False">
                                <Setter Property="Opacity" TargetName="border" Value="0.56"/>
                            </Trigger>
                            <!-- Original triggers -->
                            <!--<Trigger Property="IsMouseOver" Value="True">
                                <Setter Property="BorderBrush" TargetName="border" Value="#FF7EB4EA"/>
                            </Trigger>
                            <Trigger Property="IsKeyboardFocused" Value="True">
                                <Setter Property="BorderBrush" TargetName="border" Value="#FF569DE5"/>
                            </Trigger>-->
                            <!-- MY trigger -->
                            <Trigger Property="IsFocused" Value="True">
                                <Setter Property="BorderBrush" Value="Green"/>
                                <Setter Property="BorderThickness" Value="2"/>
                            </Trigger>
                        </ControlTemplate.Triggers>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
    </Window.Resources>

    <Grid Margin="5">
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="Auto"/>
        </Grid.RowDefinitions>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="Auto"/>
            <ColumnDefinition Width="*"/>
        </Grid.ColumnDefinitions>

        <Label Content="Your hobo name:"/>
        <TextBox
            Grid.Column="1" Height="25"
            Margin="5"/>
        <Label Grid.Row="1" Content="Favorite cheese:" />
        <TextBox
            Grid.Row="1" Grid.Column="1" Height="25"
            Margin="5"/>
    </Grid>

919-001

About Sean
Software developer in the Twin Cities area, passionate about software development and sailing.

Текстовые элементы управления

Последнее обновление: 18.01.2016

TextBlock

Элемент предназначен для вывода текстовой информации, для создания простых надписей:

<StackPanel>
    <TextBlock>Текст1</TextBlock>
    <TextBlock Text="Текст2" />
</StackPanel>

Ключевым свойством здесь является свойство Text, которое задает текстовое содержимое. Причем в случае <TextBlock>Текст1</TextBlock>
данное свойство задается неявно.

С помощью таких свойств, как FontFamily, TextDecorations и др., мы можем настроить отображение текста. Однако мы можем задать и более сложное форматирование, например:

<TextBlock TextWrapping="Wrap">
    <Run FontSize="20" Foreground="Red" FontWeight="Bold">О</Run>
    <Run FontSize="16" Foreground="LightSeaGreen">негин был, по мненью многих...</Run>
</TextBlock>

TextBlock в WPF

Элементы Run представляют куски обычного текста, для которых можно задать отдельное форматирование.

Для изменения параметров отображаемого текста данный элемент имеет такие свойства, как LineHeight,
TextWrapping и TextAlignment.

Свойство LineHeight позволяет указывать высоту строк.

Свойство TextWrapping позволяет переносить текст при установке этого свойства TextWrapping="Wrap". По умолчанию это свойство имеет
значение NoWrap, поэтому текст не переносится.

Свойство TextAlignment выравнивает текст по центру (значение Center), правому (Right) или левому краю (Left): <TextBlock TextAlignment="Right">

Для декорации текста используется свойство TextDecorations, например, если TextDecorations="Underline", то текст будет подчеркнут.

Если нам вдруг потребуется перенести текст на другую строку, то тогда мы можем использовать элемент LineBreak:

<TextBlock>
	Однажды в студеную зимнюю пору
    <LineBreak />
    Я из лесу вышел
</TextBlock>

TextBox

Если TextBlock просто выводит статический текст, то этот элемент представляет поле для ввода текстовой информации.

Он также, как и TextBlock, имеет свойства TextWrapping, TextAlignment и TextDecorations.

С помощью свойства MaxLength можно задать предельное количество вводимых символов.

<TextBox MaxLength="250" TextChanged="TextBox_TextChanged">Начальный текст</TextBox>

В коде C# мы можем обработать событие изменения текста:

private void TextBox_TextChanged(object sender, TextChangedEventArgs e)
{
	TextBox textBox = (TextBox)sender;
	MessageBox.Show(textBox.Text);
}

По умолчанию, если вводимый текст превышает установленные границы поля, то текстовое поле растет, чтобы вместить весь текст. Но визуально это не очень
хорошо выглядит. Поэтому, как и в случае с TextBlock, мы можем перенести непомещающийся текст на новую строку, установив свойство
TextWrapping=»Wrap».

Чобы переводить по нажатию на клавишу Enter курсор на следующую строку, нам надо установить свойство AcceptsReturn="True".

Также мы можем добавить полю возможность создавать табуляцию с помощью клавиши Tab, установив свойство AcceptsTab="True"

Для отображения полос прокрутки TextBox поддерживает свойства VerticalScrollBarVisibility и НоrizontalScrollBarVisibility:

<TextBox AcceptsReturn="True" Height="100" VerticalScrollBarVisibility="Auto" 
         HorizontalScrollBarVisibility="Auto">Начальный текст</TextBox>

Возможно, при создании приложения нам потребуется сделать текстовое поле недоступным для ввода (на время в зависимости от условий или вообще),
тогда для этого нам надо установить свойство IsReadOnly="True".

Для выделения текста есть свойства SelectionStart, SelectionLength и SelectionText.
Например, выделим программно текст по нажатию кнопки:

<StackPanel>
    <TextBox x:Name="textBox1" Height="100" SelectionBrush="Blue" />
    <Button Content="Выделить текст" Height="30" Width="100" Click="Button_Click" Margin="10" />
</StackPanel>

Обработчик нажатия кнопки:

private void Button_Click(object sender, RoutedEventArgs e)
{
    textBox1.SelectionStart = 5;
    textBox1.SelectionLength = 10;
    textBox1.Focus();
	// данное выражение эквивалентно
	//textBox1.Select(5, 10);
}

Проверка орфографии

TextBox обладает встроенной поддержкой орфографии. Чтобы ее задействовать, надо установить свойство SpellCheck.IsEnabled="True".
Кроме того, по умолчанию проверка орфографии распространяется только на английский язык, поэтому, если приложение заточено под другой язык, нам надо его
явным образом указать через свойство Language:

<DockPanel>
    <TextBox SpellCheck.IsEnabled="True" Language="ru-ru">Привет, как дила?</TextBox>
</DockPanel>

Проверка орфографии в WPF

Метка (Label)

Главной особенностью меток является поддержка мнемонических команд-клавиш быстрого доступа, которые передают фокус связанному элементу. Например,

<Label Target="{Binding ElementName=TextBox1}">_привет</Label>
<TextBox Name="TextBox1" Margin="0 30 0 0" Height="30" Width="100"></TextBox>

Теперь, нажав на клавишу «п», мы переведем фокус на связанное текстовое поле. При вызове приложения подчеркивание не отображается, чтобы отображать подчеркивание, надо нажать на клавишу Alt.
Тогда чтобы перевести фокус на связанное текстовое поле необходимо будет нажать сочетание Alt + «п».
Если не предполагается использование клавиш быстрого доступа, то для вывода обычной текста вместо меток лучше использовать элемент TextBlock.

PasswordBox

Элемент предназначен для ввода парольной информации. По сути это тоже текстовое поле, только для ввода символов используется маска.
Свойство PasswordChar устанавливает символ маски, отображаемый при вводе пароля. Если это свойство не задано, то по умолчанию
для маски символа используется черная точка.
Свойство Password устанавливает парольную строку, отображаемую по умолчанию при загрузке окна приложения.

<StackPanel>
    <PasswordBox PasswordChar="*" MinHeight="30" />
    <PasswordBox MinHeight="30" />
</StackPanel>

PasswordBox в WPF

RichTextBox

Для вывода текстового содержимого, насыщенного форматированием, графикой, предназначен RichTextBox. Можно даже сказать, что он выводит не
просто текст, а документы с более сложным форматированием, чем обычный TextBox. Более подробно о нем, а также как на его основе создать
простой текстовый редактор, мы поговорим в главе, посвященной документам.

Я хочу, чтобы текстовое поле WPF имело границу DarkBlue и толщину, равную 1. Я хочу, чтобы WPF имел эту границу ( DarkBlue, толщина равна 1 ), даже когда выбрано TextBox.

Я попытался выполнить эту задачу с помощью следующего кода. Однако это вообще не работает. Любые идеи или подсказки? Любая помощь будет принята с благодарностью.

  <Style x:Key="ReadOnlyLargeTextBox" TargetType="{x:Type TextBox}" >
        <Setter Property="Height" Value="80"/>
        <Setter Property="MaxHeight" Value="80"/>

        <Setter Property="VerticalScrollBarVisibility" Value="Visible"/>
        <Style.Triggers>
            <Trigger Property="TextBox.IsMouseOver"    Value="True">
                <Setter Property="BorderBrush" Value="DarkBlue"/>
                <Setter Property="BorderThickness" Value="1"/>
            </Trigger>
            <Trigger Property="TextBox.IsMouseOver"    Value="False">
                <Setter Property="BorderBrush" Value="DarkBlue"/>
                <Setter Property="BorderThickness" Value="1"/>
            </Trigger>
        </Style.Triggers>


    </Style>

PS Обратите внимание, что текстовое поле не имеет свойства IsSelected.

4 ответы

просто посмотри, ты этого хочешь…

<Style x:Key="TextBoxStyle1" BasedOn="{x:Null}" TargetType="{x:Type TextBox}">
        <Setter Property="BorderThickness" Value="1"/>
        <Setter Property="Padding" Value="1"/>
        <Setter Property="AllowDrop" Value="true"/>
        <Setter Property="FocusVisualStyle" Value="{x:Null}"/>
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type TextBox}">
                <Border x:Name="bg" BorderBrush="#FF825E5E" BorderThickness="1">
                        <ScrollViewer x:Name="PART_ContentHost" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/>
                        </Border>
                    <ControlTemplate.Triggers>

                        <Trigger Property="IsMouseOver" Value="True">
                            <Setter Property="BorderBrush" TargetName="bg" Value="DarkBlue"/>
                            <Setter Property="BorderThickness" TargetName="bg" Value="2"/>
                        </Trigger>
                        <Trigger Property="IsFocused" Value="True">
                            <Setter Property="BorderBrush" TargetName="bg" Value="DarkBlue"/>
                            <Setter Property="BorderThickness" TargetName="bg" Value="2"/>
                        </Trigger>

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

Создан 30 сен.

Я думаю, что ваша проблема связана с тем, что значение свойства Trigger содержит Текстовое окно. Вам просто нужно название свойства.

    <Style x:Key="ReadOnlyLargeTextBox" TargetType="{x:Type TextBox}">
        <Setter Property="Height" Value="80"/>
        <Setter Property="MaxHeight" Value="80"/>

        <Setter Property="VerticalScrollBarVisibility" Value="Visible"/>

        <Style.Triggers>
            <Trigger Property="IsFocused"  Value="True">
                <Setter Property="BorderBrush" Value="Blue"/>
                <Setter Property="BorderThickness" Value="1"/>
            </Trigger>
            <Trigger Property="IsMouseOver" Value="True">
                <Setter Property="BorderBrush" Value="Blue"/>
                <Setter Property="BorderThickness" Value="1"/>
            </Trigger>
        </Style.Triggers>
    </Style>

Создан 30 сен.

Проверьте FocusVisualStyle свойство объекта FrameworkElement (предок TextBox). Его цель — определить стиль, применяемый при выборе элемента.

Создан 30 сен.

У вас есть та же логика, когда «IsMouseOver» True и False. Измените один, и вы должны увидеть что-то.

Создан 30 сен.

Не тот ответ, который вы ищете? Просмотрите другие вопросы с метками

wpf
textbox
styling

or задайте свой вопрос.

Понравилась статья? Поделить с друзьями:

Читайте также:

  • Как изменить цвет границы css
  • Как изменить цвет границ окон
  • Как изменить цвет градиента фотошоп
  • Как изменить цвет градиента inkscape
  • Как изменить цвет гортензии крупнолистной

  • 0 0 голоса
    Рейтинг статьи
    Подписаться
    Уведомить о
    guest

    0 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии