Newsgroup: it.comp.lang.visual-basic
Titolo: Immagini con l'aspetto "Disabled"

Salve a tutti.
Sono rimasto abbastanza sorpreso nel constatare che in WPF l'immagine in un Button disabilitato rimane identica a se stessa, e non viene ad esempio convertita in grigio come in Windows Form.
La cosa che mi ha dato più fastidio è che non esiste un modo predefinito per ottenere questo comportamento.
Per quanto possa sembrare banale ai più esperti vorrei postare quindi una mia soluzione basata su del codice trovato in giro su internet, nel caso possa tornare utile a qualcuno.
 
Namespace CustomControls
    Friend Class GreyableImage
        Inherits Image
 
        Private _Source As BitmapSource
        Private GSBitmap As FormatConvertedBitmap 'GSBitmap sta per GrayScaleBitmap.
        Private OM As ImageBrush 'OM sta per OpacityMask.
 
        Public Shadows Property Source As BitmapSource
            Get
                Return _Source
            End Get
            Set(ByVal value As BitmapSource)
                _Source = value
                GSBitmap = New FormatConvertedBitmap()
                GSBitmap.BeginInit()
                GSBitmap.Source = value
                GSBitmap.DestinationFormat = PixelFormats.Gray16
                GSBitmap.EndInit()
                OM = New ImageBrush(value)
                If MyBase.IsEnabled Then
                    MyBase.OpacityMask = Nothing
                    MyBase.Source = value
                Else
                    MyBase.OpacityMask = OM
                    MyBase.Source = GSBitmap
                End If
            End Set
        End Property
 
        Private Sub GreyableImage_Initialized(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Initialized
            _Source = DirectCast(MyBase.Source, BitmapSource)
            GSBitmap = New FormatConvertedBitmap()
            GSBitmap.BeginInit()
            GSBitmap.Source = _Source
            GSBitmap.DestinationFormat = PixelFormats.Gray16
            GSBitmap.EndInit()
            OM = New ImageBrush(_Source)
        End Sub
 
        Private Sub GreyableImage_IsEnabledChanged(ByVal sender As Object, ByVal e As System.Windows.DependencyPropertyChangedEventArgs) Handles Me.IsEnabledChanged
            If MyBase.IsEnabled Then
                MyBase.OpacityMask = Nothing
                MyBase.Source = _Source
            Else
                MyBase.OpacityMask = OM
                MyBase.Source = GSBitmap
            End If
        End Sub
    End Class
End Namespace
 
Nel codice xaml bisogna ovviamente fare riferimento al namespace:
 
<Window x:Class="Window1"
    xmlns="
http://schemas.microsoft.com/winfx/2006/xaml/presentation
"
    xmlns:x="
http://schemas.microsoft.com/winfx/2006/xaml
"
    xmlns:local="clr-namespace:CustomControls"
    Title="Window1" Height="598" Width="693">
 
...
 
<local:GreyableImage .../>
 
...
 
</Window>

 Sono rimasto abbastanza sorpreso nel constatare che in WPF l'immagine in un Button disabilitato rimane identica a se stessa, e non viene ad esempio convertita in grigio come in Windows Form.
 
Io non ne so una mazza, ma ho provato con VS Express 2012 e non � cos�. 
Quindi suppongo che abbiano cambiato qualcosa.
 
-- 
Saluti
VITRIOL

 l'immagine in un Button
 
OK, non avevo capito che si parlava di immagine :-)
 
-- 
Saluti
VITRIOL

Ho trovato un modo molto più semplice nonchè esteticamente più gradevole (peccato non averci pensato subito):
 
<Style TargetType="Image">
    <Setter Property="Stretch" Value="None"/>
    <Style.Triggers>
        <Trigger Property="IsEnabled" Value="False">
            <Setter Property="Opacity" Value="0.4"/>
        </Trigger>
    </Style.Triggers>
</Style>


 
.m
 
-- 
blog @ //
milestone.topics.it
 
 
 

On 17/09/2012 22:09, antologiko wrote:
zac
ammazza che roba per un disable!!!
mi par di capire che però una soluzione "alla web" sia la strada giusta?
 
scateno un evento che mi sostituisce l'immagine colorata con un altra 
"grigia"?
 
chiedo allora....da IGNORANTE ancora a winform
 
visto che wpf mi diceva Nicola c'ha gli equivalenti dei fogli di stile
uno stile per il bottone/immagine/coso normale
ed una per il disable?
e casomai una se ci passo sopra? (in puro stile css hover)
 
se po fà? più difficile?
illuminatemi (per modo di dire eh!!!!)

 visto che wpf mi diceva Nicola c'ha gli equivalenti dei fogli di stile
 
appunto:



 
Ciao, applicando l'esempio mi da l'errore: Tipo effects:GrayscaleEffect non trovato.

Ciao antologiko,

hai installato la libreria Radical.Windows con Nuget?
hai dichiarato il namespace xml?


 hai dichiarato il namespace xml?
 
Ehm già avevo solo copincollato! Però così mi pare ancora più complicato; se per ottenere l'effetto disabled devo installare una libreria, tanto vale...
Comunque grazie del suggerimento :-)

 Comunque grazie del suggerimento :-)
 
come preferisci.
