C# ControlTempate wpf文本框不显示文本和触发器属性
我正在继续学习C#WPF的一个小项目。我目前的情况是,当用户输入出现错误时,我想更改C# ControlTempate wpf文本框不显示文本和触发器属性,c#,wpf,xaml,C#,Wpf,Xaml,我正在继续学习C#WPF的一个小项目。我目前的情况是,当用户输入出现错误时,我想更改文本框的边框,例如无法将其输入解析为十进制数 经过一些阅读,我使用了一个控件模板,下面是XAML,但是当我运行项目时,使用控件模板(textBox1)的TextBox不会显示任何文本,我看不出我做错了什么。有人能帮忙吗 在我学习的同时,我正在使用IsMouseOver属性触发更改,但在我的项目中,我想触发一个错误属性,因此在我的脑海中,我需要将属性IsError作为bool添加到我的TextBox控制中,当我测试
文本框的边框,例如无法将其输入解析为十进制数
经过一些阅读,我使用了一个控件模板,下面是XAML,但是当我运行项目时,使用控件模板(textBox1)的TextBox
不会显示任何文本,我看不出我做错了什么。有人能帮忙吗
在我学习的同时,我正在使用IsMouseOver
属性触发更改,但在我的项目中,我想触发一个错误属性,因此在我的脑海中,我需要将属性IsError
作为bool添加到我的TextBox
控制中,当我测试用户输入时,在我的代码后面,如果解析失败,我会将TextBox
属性IsError
设置为true,这将触发错误ControlTemplate
更改。然而,这是可以做到的,还是有一种更为标准的方法来做到这一点?
谢谢
ControlTemplate的XAML
<Window x:Class="TestContentStyle.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="StyleTriggersSample" Height="100" Width="300">
<Window.Resources>
<!--A ControlTemplate for textbox including error-->
<ControlTemplate TargetType ="TextBox" x:Key="OnError">
<TextBox Name="TextBox"
FontSize="28"
HorizontalAlignment="Center"
VerticalAlignment="Center"
BorderBrush="Silver"
BorderThickness="1"
Height="50"
Width="120"/>
<ControlTemplate.Triggers>
<Trigger Property="IsMouseOver"
Value="True">
<Setter TargetName="TextBox"
Property="BorderThickness"
Value="5" />
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Window.Resources>
<Grid>
<TextBox Text="Tesing1" Margin="146,23,0,0" Name="textBox1" Template="{StaticResource OnError}" />
<TextBox Text="Testing2" Height="23" HorizontalAlignment="Left" Margin="12,23,0,0" Name="Test1" VerticalAlignment="Top" Width="120" />
</Grid>
首先,模板定义控件的呈现方式。它们定义了它们的整体外观
您正在告诉TextBox
使用另一个不同的TextBox
内部呈现自己。这意味着你在应用程序中看到的文本框实际上不是你在网格中定义的带有“Testing1”文本的文本框,而是你在控制模板中定义的没有文本集的文本框
但除此之外,您不需要一个全新的ControlTemplate
。您只需要一个样式
:
<Window.Resources>
<Style TargetType="TextBox" x:Key="OnError">
<Setter Property="FontSize" Value="28" />
<Setter Property="HorizontalAlignment" Value="Center" />
<Setter Property="VerticalAlignment" Value="Center" />
<Setter Property="BorderBrush" Value="Silver" />
<Setter Property="Height" Value="50" />
<Setter Property="Width" Value="120" />
<Style.Triggers>
<Trigger Property="IsMouseOver"
Value="True">
<Setter Property="BorderThickness"
Value="5" />
</Trigger>
</Style.Triggers>
</Style>
</Window.Resources>
<Grid>
<TextBox Text="Tesing1" Margin="146,23,0,0" Name="textBox1" Style="{StaticResource OnError}" />
<TextBox Text="Testing2" Height="23" HorizontalAlignment="Left" Margin="12,23,0,0" Name="Test1" VerticalAlignment="Top" Width="120" />
</Grid>
此外,在WPF中,您通常不使用边距
来创建布局:p相反,您应该将列定义和行定义添加到网格中,并使用文本框上的Grid.Row
和Grid.Column
附加属性来指定它们在视图中的位置。您可以使用WPF附带的内置验证来完成这一点验证方法示例我看到了所有使用过的视图模型,它们都是frank abit advanced for Me您使用的是TextBox
在TextBox
的ControlTemplate
中,这没有任何意义。谢谢,有趣的是,我使用了一种样式开始这一过程,但认为ControlTemplate是正确的:-(至于布局,是的,我知道表单,但这只是一个临时项目,只是为了测试它,所以我没有打扰,但我会记住在发布之前整理一下。顺便问一下,你知道我是否可以像我描述的那样为文本框定义我自己的属性以用于触发目的?你可以扩展文本框
类来创建你的客户m textbox,并在那里添加您的属性。或者您可以使用附加属性,这些属性可能现在对您来说有点太高级了。是的,样式很好,感谢您提供关于扩展textbox类的建议,并了解我们学习者的局限性,不是所有的海报都能看到我们正在学习走路,而且还没有准备好为了和你们一起运行…一个新的学习项目开始扩展TextBox类谢谢!-)不客气!只是一个提示;)如果你计划在触发器中使用你的新属性,你必须确保它通过PropertyChanged事件通知它的更改(这意味着你的自定义TextBox必须实现IPropertyChanged接口)... 或者使您的属性成为依赖属性,而不仅仅是常规属性。依赖项属性更复杂,但有很多好处,因此可能值得检查。感谢为依赖项属性提供的额外建议,我不妨扩展一下自己:-)