C# 为“我的PNG图像”按钮创建禁用状态

C# 为“我的PNG图像”按钮创建禁用状态,c#,silverlight,xaml,C#,Silverlight,Xaml,我正在研究工具栏控件,需要想出一些效果,使按钮变灰或其他东西 所以,假设我有PNG图标,我想以某种方式“褪色”它们。这可以通过XAML实现吗?还是我需要为此编写代码?有指针吗?您可以使用每像素过滤器,正如Christian Graus在其()中所演示的: 不安全 { 字节*p=(字节*)(空*)扫描0; int nOffset=步幅-b.宽度*3; 字节红、绿、蓝; 对于(int y=0;y

我正在研究工具栏控件,需要想出一些效果,使按钮变灰或其他东西


所以,假设我有PNG图标,我想以某种方式“褪色”它们。这可以通过XAML实现吗?还是我需要为此编写代码?有指针吗?

您可以使用每像素过滤器,正如Christian Graus在其()中所演示的:

不安全
{
字节*p=(字节*)(空*)扫描0;
int nOffset=步幅-b.宽度*3;
字节红、绿、蓝;
对于(int y=0;y

有关更多示例和其他过滤器,请参见链接页面。

当Button.IsEnabled为false时,只需将图像的不透明度设置为30%或50%


编辑:我想您可以将Image.Source属性更改为禁用的图像文件。有几种方法可以做到这一点:有两个图像元素,并将可见性属性绑定到按钮的IsEnabled属性;通过值转换器运行Image.Source属性;或者,当IsEnabled属性更改时,使用混合触发器更改源属性。

颜色仍然存在,我不希望这样,那么您需要使用XAML资源而不是PNG。这是XAML资源优于静态图像文件的几个原因之一。我的设计师不知道如何使用XAML。没有办法在SL中更改图像?您可能可以对像素执行一些操作(例如将图像隐藏在代码中,将其转换为可写位图,将可写位图.pixels数组过滤到灰度,然后将该图像替换为原始图像),但这是相当多的工作。我在我的编辑中描述了一种CPU密集度较低的方法(代码较少,因此出错的可能性较小),在这种方法中,每个按钮都有一个常规PNG和一个禁用PNG,然后将它们适当地交换掉。我首先考虑了这一点,但没有将所有50多个文件都放在上面。在我看来,保存两份拷贝是一种维护密集型的方法。哎呀!我没看到那个标签!然而,在网上闲逛之后,我找不到任何地方明确表示不能一起使用它们。
unsafe
{
    byte * p = (byte *)(void *)Scan0;

    int nOffset = stride - b.Width*3;

    byte red, green, blue;

    for(int y=0;y < b.Height;++y)
    {
        for(int x=0; x < b.Width; ++x )
        {
           blue = p[0];
           green = p[1];
           red = p[2];

           p[0] = p[1] = p[2] = (byte)(.299 * red 
               + .587 * green 
               + .114 * blue);

           p += 3;
       }
       p += nOffset;
   }
}