gpt4 book ai didi

c# - 如何以编程方式更改 WPF 矩形样式

转载 作者:太空狗 更新时间:2023-10-29 18:35:56 25 4
gpt4 key购买 nike

[编辑] *我忘记包含返回的异常

“System.Windows.Style”不是属性“Fill”的有效值*

这是我的第一篇文章,我已经搜索了很多可能已经没有成功回答的问题。在涉及 MVVM、Prism 和 WPF 时,我完全是个菜鸟,而且我在这方面深陷困境。

我希望根据模型中的 bool 值更改 2 个矩形的内容(绑定(bind)通过)。

如果测试返回 Pass (bool True),那么我们为第一个矩形显示颜色绿色,第二个矩形将显示 UserControl.Resource Style x:Key="RectanglePass"。如果测试失败,则第一个矩形为红色,第二个显示 UserControl.Resource Style x:Key="RectangleFail"

我有以下 xaml 代码:

<UserControl x:Class="Integration.Memjet.Aoqc.Views.ProcessResultView"
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"
mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="300">

<UserControl.Resources>
<Style x:Key="RectangleFail" TargetType="Rectangle">
<Setter Property="Fill">
<Setter.Value>
<VisualBrush>
....
</VisualBrush>
</Setter.Value>
</Setter>
</Style>
<Style x:Key="RectanglePass" TargetType="Rectangle">
<Setter Property="Fill">
<Setter.Value>
<VisualBrush>
....
</VisualBrush>
</Setter.Value>
</Setter>
</Style>
</UserControl.Resources>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="60"></RowDefinition>
<RowDefinition Height="60"></RowDefinition>
<RowDefinition></RowDefinition>
</Grid.RowDefinitions>
<Label VerticalAlignment="Center" HorizontalAlignment="Center" FontSize="20">PASS</Label>
<Rectangle Name="rectStatus" Grid.Row="1">
<Rectangle.Style>
<Style TargetType="{x:Type Rectangle}">
<Style.Triggers>
<DataTrigger Binding="{Binding Passed}" Value="True">
<Setter Property="Fill" Value="Green" />
</DataTrigger>
<DataTrigger Binding="{Binding Passed}" Value="False">
<Setter Property="Fill" Value="Red" />
</DataTrigger>
</Style.Triggers>
</Style>
</Rectangle.Style>
</Rectangle>

<Rectangle Name="rectStatusImg" Width="120" Height="120" Grid.Row="2" >
<Rectangle.Style>
<Style TargetType="{x:Type Rectangle}">
<Style.Triggers>
<DataTrigger Binding="{Binding Passed}" Value="True">
<Setter Property="Fill" Value="{StaticResource RectanglePass}" />
</DataTrigger>
<DataTrigger Binding="{Binding Passed}" Value="False">
<Setter Property="Fill" Value="{StaticResource RectangleFail}" />
</DataTrigger>
</Style.Triggers>
</Style>
</Rectangle.Style>
</Rectangle>
</Grid>
</UserControl>

以上不起作用并返回异常。如果我用这一行替换第二个矩形标记 (rectStatusImg);

<Rectangle Name="rectStatusImg" Style="{StaticResource RectanglePass}" Width="120" Height="120" Grid.Row="2" ></Rectangle>

xaml 工作并产生了预期的结果!但我希望将它绑定(bind)到 Boolean Passed 以便我可以通过编程方式更改它。

我真的希望我能够在这里解释我的问题。

在此先感谢您的帮助,本站一直是个宝,帮了大忙。

干杯,西蒙

最佳答案

在你的资源中定义两个视觉画笔并创建一个带有数据触发器的矩形样式

  <VisualBrush x:Key="FailBrush">Black</VisualBrush>
<VisualBrush x:Key="PassBrush">Red</VisualBrush>

<Style x:Key="ColorRectangleStyle" TargetType="Rectangle">
<Setter Property="Fill" Value="{StaticResource FailBrush}"/>
<Style.Triggers>
<DataTrigger Binding="{Binding Passed}" Value="False">
<Setter Property="Fill" Value="{StaticResource PassBrush}"/>
</DataTrigger>
</Style.Triggers>
</Style>

并像这样在矩形中使用它

<Rectangle Name="rectStatusImg" Width="120" Height="120" Grid.Row="2" Style="{StaticResource ColorRectangleStyle}" />

希望对您有所帮助。

关于c# - 如何以编程方式更改 WPF 矩形样式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13945102/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com