C# 根据显示的文本触发颜色更改的更好方法 我有一个struct类,它记录一个值和一个检查,它只是简单地说它是好是坏 我想创建一个TextBlock,当值为“Bad”时,其背景变为红色。这就是我目前在用户控件的XAML中所做的 因此,这里发生的事情是,我正在通过将显示的TextBlock绑定到折叠的TextBlock来更改Background的颜色,在这种情况下,我以以下方式绑定viewModel中的StressCheck值
在XAML中C# 根据显示的文本触发颜色更改的更好方法 我有一个struct类,它记录一个值和一个检查,它只是简单地说它是好是坏 我想创建一个TextBlock,当值为“Bad”时,其背景变为红色。这就是我目前在用户控件的XAML中所做的 因此,这里发生的事情是,我正在通过将显示的TextBlock绑定到折叠的TextBlock来更改Background的颜色,在这种情况下,我以以下方式绑定viewModel中的StressCheck值,c#,wpf,textblock,dependencyobject,C#,Wpf,Textblock,Dependencyobject,在XAML中 <UserControl x:Class="ScienceProgram.Views.TestView" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
<UserControl x:Class="ScienceProgram.Views.TestView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:ScienceProgram.Views"
xmlns:uc="clr-namespace:ScienceProgram.UserControls"
mc:Ignorable="d"
d:DesignHeight="1200" d:DesignWidth="811">
<Grid Margin="5">
<Grid.RowDefinitions>
<RowDefinition Height="65"/>
</Grid.RowDefinitions>
<StackPanel>
<uc:DataCellCheck Value="{Binding Path=DisplayStressValue }" Check="{Binding Path=DisplayStressCheck}"/>
</StackPanel>
</Grid>
</UserControl>
StressCheck
并将其隐藏在另一个文本块中Check
属性,而不是另一个TextBlock
:
值得一提的是,我更喜欢为一个值包含一个setter,并为另一个值使用触发器(如果有多个值,则使用其他触发器):
无论哪种方式,WPF都隐式处理enum
类型,将提供的文本值解析为实际的enum值,并将其用于触发器的比较。您不需要额外的TextBlock
或其他机制(如转换器)在放入XAML的文本和实际的enum
值之间进行转换
如果上述内容不能解决您的问题,请通过提供良好的MCVE来改进问题,以便能够理解您的场景的完整背景
是否有更好的方法触发显示的文本块中的颜色更改,而不必绑定Stress Check并将其隐藏在另一个文本块中
我希望如此。你现在做这件事的方式很笨拙
如果没有,就不可能确认这在您的具体场景中是否有效,但它应该是这样的。您可以只绑定到触发器中的Check
属性,而不是另一个TextBlock
:
值得一提的是,我更喜欢为一个值包含一个setter,并为另一个值使用触发器(如果有多个值,则使用其他触发器):
无论哪种方式,WPF都隐式处理enum
类型,将提供的文本值解析为实际的enum值,并将其用于触发器的比较。您不需要额外的TextBlock
或其他机制(如转换器)在放入XAML的文本和实际的enum
值之间进行转换
如果上述内容不能解决您的问题,请提供一个好的MCVE来改进问题,以便了解您的场景的完整背景。对不起。我真的不能投票,因为我没有足够的分数。在我把你的回答标记为答案之前,我希望从其他人那里得到不同的答案。但是,我想我不会得到更多的答案了,因为我的问题是基本的。不管怎样,给你!谢谢你。我真的不能投票,因为我没有足够的分数。在我把你的回答标记为答案之前,我希望从其他人那里得到不同的答案。但是,我想我不会得到更多的答案了,因为我的问题是基本的。不管怎样,给你!谢谢
<UserControl x:Class="ScienceProgram.UserControls.DataCellCheck"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
x:Name="parent">
<UserControl.Resources>
<Style x:Key="CheckStress" TargetType="TextBlock">
<Style.Triggers>
<DataTrigger Binding="{Binding ElementName=TB,Path=Text}" Value="Good">
<Setter Property="Background" Value="Green" />
</DataTrigger>
<DataTrigger Binding="{Binding ElementName=TB,Path=Text}" Value="Bad">
<Setter Property="Background" Value="Red" />
</DataTrigger>
</Style.Triggers>
</Style>
</UserControl.Resources>
<Grid Margin="1" DataContext="{Binding ElementName=parent}" Width="100">
<TextBlock Style="{StaticResource CheckStress}" Text="{Binding Path=Value}" />
<TextBlock x:Name="TB" Text="{Binding Path=Check}" Visibility="Collapsed"/>
</Grid>
public partial class DataCellCheck : UserControl
{
public DataCellCheck()
{
InitializeComponent();
}
public static readonly DependencyProperty ValueProp =
DependencyProperty.Register("Value", typeof(string),
typeof(DataCellCheck), new PropertyMetadata(""));
public string Value
{
get { return GetValue(ValueProp) as String; }
set { SetValue(ValueProp, value); }
}
public static readonly DependencyProperty StatusProp =
DependencyProperty.Register("Check", typeof(string),
typeof(DataCellCheck), new PropertyMetadata(""));
public string Check
{
get { return GetValue(StatusProp) as String; }
set { SetValue(StatusProp, value); }
}
}
public class TestViewModel : BindableBase
{
public Stress MyFirstStress { get; set; }
public TestViewModel()
{
MyFirstStress = new Stress(1245, StressCheck.Fail);
}
public double DisplayStressValue => MyFirstStress.StressValue;
public string DisplayStressCheck => MyFirstStress.Check.ToString();
}
<UserControl x:Class="ScienceProgram.Views.TestView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:ScienceProgram.Views"
xmlns:uc="clr-namespace:ScienceProgram.UserControls"
mc:Ignorable="d"
d:DesignHeight="1200" d:DesignWidth="811">
<Grid Margin="5">
<Grid.RowDefinitions>
<RowDefinition Height="65"/>
</Grid.RowDefinitions>
<StackPanel>
<uc:DataCellCheck Value="{Binding Path=DisplayStressValue }" Check="{Binding Path=DisplayStressCheck}"/>
</StackPanel>
</Grid>
</UserControl>