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
18.4k15 gold badges73 silver badges93 bronze badges
asked Jun 5, 2009 at 12:27
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
3
I was able to get it programatically with:
TextBox.BorderBrush = SystemColors.ControlDarkBrush;
answered Jan 14, 2010 at 23:52
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
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 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
Запись от Элд Хасп размещена 24.11.2018 в 09:13
Обновил(-а) Элд Хасп 07.12.2018 в 10:50
(Изменение категории)
Вопрос в том, как поменять цвет рамки или убрать рамку TextBox при фокусировке. В невыделанном состоянии для рамки используется кисть из свойства TextBox.BorderBrush. Но при выделении (Focus или MouseOver) используемые кисти недоступны.
Есть несколько способов решения этого вопроса. В основном предлагается переопределение шаблона с использование триггеров.
Я предлагаю внесением изменений в дефолтный шаблон сделать доступными для изменения кисти для рамок.
Рассмотрим дефолтный шаблон TextBox
Кликните здесь для просмотра всего текста
XML | ||
|
Рамку при наведении мыши определяют теги 26-28 строк, клавиатуры — строки 29-31. Цвет рамки для мыши определяет ресурс TextBox.MouseOver.Border, клавиатуры — TextBox.Focus.Border. Обе привязки к ресурсу статические — то есть, после инициализации шаблона их изменить нельзя.
Что бы стало возможно в определении TextBox менять эти ресурсы, изменим привязки на динамические
XML | ||
|
Теперь мы можем устанавливать цвет рамки для любого режима. Если какая-то рамка не нужна, надо установить её цвет «Transparent«. В примере устанавливаются цвета: для обычного состояния — Green, при наведении мыши — Red, при клавиатурном фокусе — Yellow
XML | ||
|
Сам переопределённый шаблон и сопутствующие ресурсы лучше прописать в словаре, чтобы не загромождать Xaml окна. Словарь, в зависимости от необходимости, подключить на уровне окна или приложения.
Ниже полный Xaml примера с определением шаблона в ресурсах окна и двумя TextBox — один без рамок.
XML | ||
|
Всего комментариев
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>
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>
Элементы 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>
Метка (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>
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 задайте свой вопрос.