问题

我有一个按钮,它的指令是ToggleMode,在这个按钮里面是FontIconTextBlock.

在Styles.xaml中,当启用按钮时,我将按钮的前景色设置为白色,如果禁用该按钮,则将其设置为浅灰色.这导致在禁用按钮Textblocks的前景色正确地改变,因为ToggleMode.CanExecute()返回假. 但是,FontIcons的正常 colored颜色 是淡蓝色,这是我使用Foreground属性设置的. 当按钮被禁用时, colored颜色 应更改为淡蓝色,以改善按钮被禁用的印象.

代码示例

布尔转换器

    <local:BooleanConverter x:Key="CanExecuteToIconColorConverter">
        <local:BooleanConverter.True>
            <SolidColorBrush Color="{ThemeResource VividSkyBlueColor}" />
        </local:BooleanConverter.True>
        <local:BooleanConverter.False>
            <SolidColorBrush Color="{ThemeResource PaleVividSkyBlueColor}" />
        </local:BooleanConverter.False>
    </local:BooleanConverter>

按钮

    <按钮 Grid.Row="0" Width="150" Padding="10"
            Command="{x:Bind ToggleMode, Mode=OneWay}">
        <Grid>
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="*"/>
                <ColumnDefinition Width="3*"/>
            </Grid.ColumnDefinitions>
            <FontIcon FontSize="20" Grid.Column="0"
                      Glyph="{StaticResource mdi_toggle_off}"
                      FontFamily="{StaticResource MaterialDesignIconsOutlined}"
                      Foreground="{ThemeResource VividSkyBlueColor}"/>
            <TextBlock Grid.Column="1" Margin="10,0,0,0" Text="Toggle"/>
        </Grid>
    </按钮>

我所try 的

我try 使用这里给出的通用布尔转换器:How do I invert BooleanToVisibilityConverter? 设置SolidColorBrush,将浅蓝色设置为True值,将淡蓝色设置为False值,并将My FontIconForeground属性绑定到命令,但这不起作用.

在那之后,我try 订阅命令的CanExecuteChanged事件,将新值保存在私有字段中并绑定到该私有字段,但这并不起作用,因为在初始化我的视图时,该命令仍然为空.

我的下一个猜测是订阅命令的属性更改事件,当这个命令被触发时,命令不应该再为空,我应该能够订阅该事件,但这看起来像是很多锅炉代码,特别是如果我有各种命令需要这样做的话.

我怎样才能更容易地做到这一点呢?

编辑1我try 将命令绑定到字体图标的方式

<FontIcon FontSize="20" Grid.Column="0"
          Glyph="{StaticResource mdi_toggle_off}"
          FontFamily="{StaticResource MaterialDesignIconsOutlined}"
          Foreground="{x:Bind ToggleCommand, Mode=OneWay, Converter={StaticResource CanExecuteToIconColorConverter}}"/>

推荐答案

在我的经验中,FontIcon有点古怪,因为在某些方面,它的表现并不像预期的那样.修改FontIcon的 colored颜色 可能适合您的特定情况(如果您可以让它工作),但在更复杂的情况下,您可能有一个必须看起来被禁用的复杂控件,它不会起作用.

在这些情况下,我更喜欢做的是避免修改单个元素的 colored颜色 ,而是执行以下操作之一:

  • 修改整个控件的透明度
  • 在控件顶部添加另一个控件,该控件几乎是透明的,但不是完全透明的,以淡出基础控件的 colored颜色 .

当某一深蓝变得略微透明时(或者当它被白色但几乎透明的阴影覆盖时),它将显示为浅蓝色,也将深橙色显示为浅橙色,依此类推.

Csharp相关问答推荐

访问C#中的数据库字段时获取数据是收件箱错误-为什么?&有效,如果声明不有效

C#中的两个线程之间读写浮点类型

List T.AddRange在传递ConcurrentDictionary作为参数时引发ArgumentExcellent

更新数据库中的对象失败,原因是:Microsoft. EntityFrame Core. GbUpdateConcurrencyResponse'

EF Core Fluent API中定义的多对多关系

哪个nuget包含SecurityStampValidatorOptions

ASP.NET MVC中创建视图的过滤器

XUNIT是否使用测试数据的源生成器?

默认情况下,.NET通用主机(Host.CreateDefaultBuilder)中是否包含UseConsoleLifetime?

使用HttpResponseMessage中的嵌套列表初始化JSON

TCPClient阅读流

NET8 Maui&;iOS:AppCenter崩溃错误

集合表达式没有目标类型

ASP.NET Core MVC将值从视图传递到控制器时出现问题

为什么此名称不再被识别?名称不存在于当前上下文中?

从Base64转换为不同的字符串返回相同的结果

C#如何获取字符串中引号之间的文本?

C#中使用ReadOnlySpan的泛型类型推理

如何在C# WinForm控件中使用Windows 10/11的黑暗主题?

try 访问字典中的模拟对象时引发KeyNotFoundException