2016-04-12 19 views
1

WPFで問題が発生しました。その中に画像がある削除ボタンを作っています。しかし、ボタンが無効になっているときは、グレースケール画像を表示したかったのです。アルファ付きFormatConvertedBitmap

Thomas Lebrun implementationが見つかりましたが、私のプログラムにクラス全体を追加したくありません。代わりに、私はこの方法で動作を模倣しようとした:

BitmapImage img_Delete = new System.Windows.Media.Imaging.BitmapImage(new Uri("the png URI", UriKind.RelativeOrAbsolute)); 
ImageSource img_DeleteDisabled = null; 

[...] 
Button btDel = new Button() { Width = 20, Height = 20, ToolTip = "Delete", Margin = new Thickness(5), HorizontalAlignment = System.Windows.HorizontalAlignment.Right }; 
btDel.IsEnabled = isdeletable(obj); 

if (!btDel.IsEnabled && (img_DeleteDisabled == null)) 
{ 
    img_DeleteDisabled = new FormatConvertedBitmap(img_Delete, PixelFormats.Gray32Float, null, 0); 
} 

btDel.Content = (new System.Windows.Controls.Image() 
{ 
    Width = 16, 
    Height = 16, 
    HorizontalAlignment = System.Windows.HorizontalAlignment.Stretch, 
    VerticalAlignment = System.Windows.VerticalAlignment.Stretch, 
    Source = btDel.IsEnabled ? img_Delete : img_DeleteDisabled 
}); 

まあ、私はあなたが表示されます。..除いそれは、期待通りに動作します。

Enabled and disabled

左の1が有効になっています、右のものは無効になります

ご覧のとおり、アルファチャンネルはなくなりました。どうすれば元に戻すことができますか?

+0

アルファチャンネルとは何ですか? – StepUp

+0

アルファチャンネルには透明度情報が含まれています:左には赤い十字が透明な背景を、灰色には黒いものがあります。 – frarugi87

+0

'btDel.Background = Brushes.Transparent; 'を設定しようとしています – StepUp

答えて

0

コメントに助けられて、私は不透明マスクを適用する場所が間違っていると考えていました。

OpacityMaskは、画像ではなくボタンに適用する必要があります。これは、不透明度がソースではなく画像全体に適用されるためです。

このため、これを実装するための正しい方法は

btDel.Content = (new System.Windows.Controls.Image() 
{ 
    Width = 16, 
    Height = 16, 
    HorizontalAlignment = System.Windows.HorizontalAlignment.Stretch, 
    VerticalAlignment = System.Windows.VerticalAlignment.Stretch, 
    Source = btDel.IsEnabled ? img_Delete : img_DeleteDisabled, 
    OpacityMask = new ImageBrush(img_Delete) 
}); 

マスクは、ボタン画像に適用されるこの方法です。結果は私が必要なものです:

Enabled and disabled

+1

私の提案が助けられ、 'Source'のような' OpacityMask'は助けられます。私はコメントではっきりしていないかもしれません(私は画像コンストラクタで書かれていますが、コードの初期化を意味します)。 – bars222

+0

@ bars222実際、私はボタンの内容を 'Image'とは考えていなかったので、' img_DeleteDisabled = new Image'コンストラクタでそれを使うと言っていたと思いました...残念です – frarugi87

+2

溶液。 – bars222

関連する問題