WPF,c# - 自定义文本框显示属性并实现数据触发器

时间:2011-08-22 12:23:54

标签: c# wpf

如何自定义文本框显示属性(例如..border,corner radius等..),并为要在其中输入的数据实现数据触发器。 要么 如何通过xaml自定义一个控件(比如文本框,列表框等)外观和实现同一控件的数据触发器......

任何人都可以帮我一个例子..

谢谢, Sekhar。

2 个答案:

答案 0 :(得分:2)

首先,“显示属性”在WPF中通常称为ControlTemplate。因此,您当然可以更改TextBox或其他控件的整个ControlTemplate,并以您喜欢的方式对其进行修改。例如,您可以将Button的ControlTemplate更改为仅显示一个Rectangle。

<ControlTemplate x:Key="myNewButton" TargetType="{x:Type Button}">
    <Rectangle Fill="{TemplateBinding Background}"/>
</ControlTemplate>


<Button Template="{StaticResource myNewButton}"/>

TemplateBinding标记是将依赖项属性(在本例中为Background)传递给ControlTemplate子项的方法。

现在,如果您想添加数据触发器,可以在ControlTemplate本身

中执行此操作
<ControlTemplate x:Key="myNewButton" TargetType="{x:Type Button}">
    <Rectangle x:Name="rect" Fill="{TemplateBinding Background}"/>

    <ControlTemplate.Triggers>
        <DataTrigger Binding="{Binding MyDataProperty}" Value="True">
            <Setter TargetElement="rect" Property="Fill" Value="Green" />
        </DataTrigger
    </ControlTemplate.Triggers>

</ControlTemplate>

答案 1 :(得分:1)

您有多种选择。如果要完全自定义控件的可视元素,可以覆盖控件样式和模板。示例如下:http://msdn.microsoft.com/en-us/library/aa970773(v=VS.100).aspx

如果您想要执行简单的UI更改,例如红色边框,如果某些值为false,则使用对象的样式:

<Style TargetType="{x:Type TextBox}">
    <Setter Property="TextElement.FontFamily" Value="Calibri" />
    <Setter Property="TextElement.FontSize" Value="14" />
    <Setter Property="TextElement.Foreground" Value="Black" />
    <Style.Triggers>
        <DataTrigger Binding="{Binding Path=IsValid}" Value="False">
            <Setter Property="Effect">
                <Setter.Value>
                    <DropShadowEffect BlurRadius="5" Color="Red" ShadowDepth="0" />
                </Setter.Value>
            </Setter>
            <Setter Property="ToolTip" Value="Something is invalid." />
       </DataTrigger>
       <DataTrigger Binding="{Binding Path=IsValid}" Value="True">
           <Setter Property="Effect" Value="{x:Null}" />
       </DataTrigger>
  </Style.Triggers>
</Style>

以上是模仿使用DataTrigger可用的错误模板的东西。本质上,它绑定到viewmodel中的布尔值,如果布尔值为false,则在文本框周围绘制红色边框,如果布尔值为true则清除它。