Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Wpf 使用ICommand的按钮未被禁用?_Wpf_Mvvm_Icommand_Canexecute - Fatal编程技术网

Wpf 使用ICommand的按钮未被禁用?

Wpf 使用ICommand的按钮未被禁用?,wpf,mvvm,icommand,canexecute,Wpf,Mvvm,Icommand,Canexecute,我的wpf mvvm应用程序中有一个按钮控件 我使用ICommand属性(在viewmodel中定义)将按钮单击事件绑定到viewmodel 我有->执行和canexecute参数用于我的ICommand实现(RelayCommand) 即使CanExecute为false…按钮未禁用…当按钮内容为图像时 但是,当按钮内容为文本时,..enable/disable可以正常工作 <Button DockPanel.Dock="Top" Com

我的wpf mvvm应用程序中有一个按钮控件

我使用
ICommand
属性(在viewmodel中定义)将按钮单击事件绑定到viewmodel

我有->执行和
canexecute
参数用于我的
ICommand
实现(
RelayCommand

即使
CanExecute
为false…按钮未禁用…当按钮内容为图像时

但是,当按钮内容为文本时,..enable/disable可以正常工作

<Button DockPanel.Dock="Top" 
                        Command="{Binding Path=MoveUpCommand}">
                    <Button.Content>
                        <Image Source="/Resources/MoveUpArrow.png"></Image>
                    </Button.Content>
                    <Style>
                        <Style.Triggers>
                            <Trigger Property="IsEnabled" Value="False">
                                <Setter Property="Opacity" Value=".5" />
                            </Trigger>
                        </Style.Triggers>
                    </Style>
                </Button>

按钮确实会被禁用,只是它不会影响图像的渲染。 您必须以将图像的不透明度更改为.5的样式编写触发器,然后您将获得所需的按钮禁用效果,如下所示:

<Style x:Key="imageButton" TargetType="Button">
        <Style.Triggers>
            <Trigger Property="IsEnabled" Value="False">
                <Setter Property="Opacity" Value=".5" />
            </Trigger>
        </Style.Triggers>
</Style>

您将需要(它不像听起来那么复杂,只需添加一个程序集引用,然后您就可以像任何内置WPF效果一样轻松地使用它)与触发器结合使用,类似于Hasan Khan发布的以灰度显示禁用按钮图像的触发器

谢谢!在我按下所有按钮后尝试了建议的代码。没用。尝试只提取触发器并将其插入所有其他按钮继承的通用按钮中:工作起来像个符咒!此代码首先:

<Style x:Key="SecButton" TargetType="Button">
    <Setter Property="FontSize" Value="16" />
    <Setter Property="Margin" Value="0,0,5,5" />
    <Style.Triggers>
        <Trigger Property="IsEnabled" Value="False">
            <Setter Property="Opacity" Value=".5" />
        </Trigger>
    </Style.Triggers>
</Style>

基于上述代码,我创建了如下按钮:

<Style x:Key="NewBtnStyle" TargetType="Button" BasedOn="{StaticResource SecButton}">                
    <Setter Property="ContentTemplate">
        <Setter.Value>
            <DataTemplate>
                <StackPanel Orientation="Horizontal">
                    <Image Source="Images/new.png" Width="50" Height="50" />
                </StackPanel>
            </DataTemplate>
        </Setter.Value>
    </Setter>
</Style>


当按钮被禁用时,其中的图像将自动暗显为0.5不透明度。

我是否必须声明属性“IsEnabled”在viewmodel中?。或者默认情况下它会从canExecute中获取该值吗?IsEnabled是按钮的属性,当您从canExecute返回false时,该属性会自动更改。我已经尝试了您告诉我的内容。它带来了一些问题。请查看我上面问题中的可用代码。我找到了错误的原因。我在内容中使用了两个以上的TEM。非常感谢。对于我们这些不太擅长WPF的人来说,展示这个插件是如何插入到按钮中的将是非常好的。当然,使用a转换为灰度比使用像素着色器更简单!这可以通过XAML实现吗?此外,像素着色器可以处理任何事情,而不仅仅是位图。无需触摸控制装置即可广泛应用。并且是在GPU上计算的(与FormarConvertedBitmap不同),让CPU和RAM专注于更重要的事情。此外,编译像素着色器需要下载500+MB的DirectX SDK,并在HLSL、.fx和.ps文件中使用不同的编码语言。因此,尽管我仍然希望在某一天使用像素着色器,但为了便于实现,我的选择显然是FormatConvertedBitmap。我的结论是:@adabyron你不需要这些。我发布的链接提供了一个可用的着色器。只要引用程序集并使用XAML的效果,就不需要其他代码了。@MatějZábský我尽可能避免附加(非托管)依赖项,并将可能需要更改的代码保留在项目中。但是,如果您确定这正是您所需要的,那么我相信这个在程序集中预编译的着色器也是一个合理的解决方案。