WPF закругленный угол текстовое поле - PullRequest
34 голосов
/ 24 января 2011

Я не знаю WPF и сейчас изучаю его.Я искал закругленные углы TextBox в WPF.Поэтому я искал в Google и нашел кусок XAML:

 <!–Rounded Corner TextBoxes–>
<ControlTemplate x:Key=”RoundTxtBoxBaseControlTemplate” TargetType=”{x:Type Control}”>
<Border Background=”{TemplateBinding Background}” x:Name=”Bd” BorderBrush=”{TemplateBinding BorderBrush}”
BorderThickness=”{TemplateBinding BorderThickness}” CornerRadius=”6″>
<ScrollViewer x:Name=”PART_ContentHost”/>
</Border>
<ControlTemplate.Triggers>
<Trigger Property=”IsEnabled” Value=”False”>
<Setter Property=”Background” Value=”{DynamicResource {x:Static SystemColors.ControlBrushKey}}” TargetName=”Bd”/>
<Setter Property=”Foreground” Value=”{DynamicResource {x:Static SystemColors.GrayTextBrushKey}}”/>
</Trigger>
<Trigger Property=”Width” Value=”Auto”>
<Setter Property=”MinWidth” Value=”100″/>
</Trigger>
<Trigger Property=”Height” Value=”Auto”>
<Setter Property=”MinHeight” Value=”20″/>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>

Так что, пожалуйста, скажите мне, куда вставить эту XAMLПожалуйста, помогите мне в деталях.Я новичок в WPF.

Ответы [ 6 ]

57 голосов
/ 24 января 2011

В WPF вы можете изменить или воссоздать внешний вид элементов управления.Так что, если ваш пример, что они сделали, они изменили внешний вид TextBox, изменив ControlTemplate существующего TextBox.Чтобы увидеть и исследовать фрагмент кода, просто используйте приведенный ниже код

<Window x:Class="WpfApplication4.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window1" Height="300" Width="300">
<Window.Resources>
    <ControlTemplate x:Key="TextBoxBaseControlTemplate" TargetType="{x:Type TextBoxBase}">
        <Border Background="{TemplateBinding Background}" 
                x:Name="Bd" BorderBrush="Black"
                BorderThickness="{TemplateBinding BorderThickness}" CornerRadius="10"> 
            <ScrollViewer x:Name="PART_ContentHost"/>
        </Border>
        <ControlTemplate.Triggers>
            <Trigger Property="IsEnabled" Value="False">
                <Setter Property="Background" Value="{DynamicResource {x:Static SystemColors.ControlBrushKey}}" TargetName="Bd"/>
                <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.GrayTextBrushKey}}"/>
            </Trigger>
            <Trigger Property="Width" Value="Auto">
                <Setter Property="MinWidth" Value="100"/>
            </Trigger>
            <Trigger Property="Height" Value="Auto">
                <Setter Property="MinHeight" Value="20"/>
            </Trigger>
        </ControlTemplate.Triggers>
    </ControlTemplate>
</Window.Resources>
<Grid>
    <TextBox Template="{StaticResource TextBoxBaseControlTemplate}" Height="25" Margin="5"></TextBox>
</Grid>

Итак, мы объявили статический ресурс в разделе Resource окна и использовали Resource TextBoxBaseControlTemplateв свойстве Template TextBox как Template="{StaticResource TextBoxBaseControlTemplate}".

Шаблоны для настройки элементов управления WPF просто обратитесь к этому документу, чтобы получить представление

http://msdn.microsoft.com/en-us/magazine/cc163497.aspx

39 голосов
/ 22 июля 2015

@ Смолла дал гораздо лучший ответ в своем комментарии к ответу @Daniel Casserly:

<TextBox Text="TextBox with CornerRadius">
  <TextBox.Resources>
    <Style TargetType="{x:Type Border}">
      <Setter Property="CornerRadius" Value="3"/>
    </Style>
  </TextBox.Resources>
</TextBox>

Если вы хотите, чтобы все границы TextBoxes и ListBoxes имели закругленные углы, поместите стиль в окно или<Resources>.

приложения
10 голосов
/ 01 апреля 2018

Вы можете изменить все текстовые поля на закругленные углы, используя следующий стиль:

<Style TargetType="{x:Type TextBox}">
  <Style.Resources>
    <Style TargetType="{x:Type Border}">
      <Setter Property="CornerRadius" Value="3" />
    </Style>
  </Style.Resources>
</Style>

Вдохновлен следующим ответом: https://stackoverflow.com/a/13858357/3387453

4 голосов
/ 24 января 2011

этот вопрос хорошо обсуждается на MSDN: http://social.msdn.microsoft.com/forums/en-US/wpf/thread/549775ed-1c2a-4911-9078-d9c724294fb3/

Попробуйте решения там, они довольно подробно и, конечно, достаточно подробно, чтобы вы знали, где разместить код.

3 голосов
/ 08 июня 2016

Просто установите текстовое поле BorderThicknessof на ноль, добавьте рамку вокруг текстового поля.

 <Border BorderThickness="1" BorderBrush="Black" CornerRadius="10" Padding="2"
        HorizontalAlignment="Center" VerticalAlignment="Center">
        <TextBox Text="Hello ! " BorderThickness="0"/>
 </Border>

Вывод, как показано на рисунке!Output!

2 голосов
/ 22 июня 2018

Вы можете использовать вложенные свойства для установки TextBox радиуса границы (также то же самое будет работать для кнопок).

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

public class CornerRadiusSetter
{
    public static CornerRadius GetCornerRadius(DependencyObject obj) => (CornerRadius)obj.GetValue(CornerRadiusProperty);

    public static void SetCornerRadius(DependencyObject obj, CornerRadius value) => obj.SetValue(CornerRadiusProperty, value);

    public static readonly DependencyProperty CornerRadiusProperty =
        DependencyProperty.RegisterAttached(nameof(Border.CornerRadius), typeof(CornerRadius),
            typeof(CornerRadiusSetter), new UIPropertyMetadata(new CornerRadius(), CornerRadiusChangedCallback));

    public static void CornerRadiusChangedCallback(object sender, DependencyPropertyChangedEventArgs e)
    {
        Control control = sender as Control;

        if (control == null) return;

        control.Loaded -= Control_Loaded;
        control.Loaded += Control_Loaded;
    }

    private static void Control_Loaded(object sender, EventArgs e)
    {
        Control control = sender as Control;

        if (control == null || control.Template == null) return;

        control.ApplyTemplate();

        Border border = control.Template.FindName("border", control) as Border;

        if (border == null) return;

        border.CornerRadius = GetCornerRadius(control);
    }
}

Затем вы можете использовать прикрепленное свойствосинтаксис свойства для стилизации нескольких текстовых полей без дубликатов стилей:

<TextBox local:CornerRadiusSetter.CornerRadius="10" />
<TextBox local:CornerRadiusSetter.CornerRadius="5, 0, 0, 5" />
<TextBox local:CornerRadiusSetter.CornerRadius="10, 4, 18, 7" />
...