问题
我有一个Button
,其命令是ToggleMode
,在这个按钮是一个FontIcon
和一个TextBlock
.
在Styles.xaml中,当启用Button
时,我将Button
的前景色设置为白色,如果禁用按钮,则设置为浅灰色。这导致当禁用Button
时,Textblocks
前景色正确更改,因为ToggleMode.CanExecute()
返回false。然而,FontIcons
正常颜色为浅蓝色。我使用Foreground
属性设置。当Button
被禁用时,颜色应该更改为淡蓝色,以改善按钮被禁用的印象。
代码示例
布尔转换器
<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>
按钮
<Button 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>
</Button>
我所尝试的
我尝试使用这里给出的通用BooleanConverter:如何反转BooleanToVisibilityConverter?设置一个SolidColorBrush
,其中浅蓝色为True Value,淡蓝色为False Value,并将FontIcon
的Foreground
属性绑定到命令,但这不起作用。
之后,我尝试订阅命令的CanExecuteChanged
事件,将新值保存在私有字段中并绑定到该字段,但这并不起作用,因为在初始化视图时,此命令仍然为空。
我的下一个猜测是订阅命令的属性更改事件,当这个命令被触发时,命令不应该再为null,我应该能够订阅事件,但这似乎是一个很大的锅炉代码,特别是如果我有各种命令,我需要这样做。
我怎样才能更容易地做到这一点?
Edit 1如何将命令绑定到FontIcon
<FontIcon FontSize="20" Grid.Column="0"
Glyph="{StaticResource mdi_toggle_off}"
FontFamily="{StaticResource MaterialDesignIconsOutlined}"
Foreground="{x:Bind ToggleCommand, Mode=OneWay, Converter={StaticResource CanExecuteToIconColorConverter}}"/>
对我有用的
跟随@AndrewKeepCoding的回答,我发现只绑定到按钮的IsEnabled属性,而不是绑定到命令本身:
<Button Grid.Row="0" Width="150" Padding="10"
Command="{x:Bind ToggleMode, Mode=OneWay}"
x:Name="ToggleModeButton">
<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="{x:Bind ToggleModeButton.IsEnabled, Mode=OneWay, Converter={StaticResource CanExecuteToIconColorConverter}}"/>
<TextBlock Grid.Column="1" Margin="10,0,0,0" Text="Toggle"/>
</Grid>
</Button>
2条答案
按热度按时间laximzn51#
让我向您展示另一种使用ValueConverter实现此目的的方法。
布尔转刷转换器.cs
MainPageViewModel.cs
MainPage.xaml
3vpjnl9f2#
根据我的经验,
FontIcon
有点不稳定,因为在某些方面它的行为并不符合预期。修改FontIcon的颜色可能适合您的特定情况,(如果您可以让它工作),但在更复杂的情况下,您可能有一个复杂的控件,必须看起来禁用,它不会工作。在这些情况下,我更喜欢避免修改单个元素的颜色,而是执行以下操作之一:
当某个深蓝色稍微透明时(或者当它被白色但几乎透明的阴影覆盖时),它将显示为浅蓝色,并且深橙子也将显示为浅橙色等。