4 Stimmen

Convertor auf ImageSource - Bild in Graustufen umwandeln

Ich habe Multibinding auf Image Control. Ich binden zwei Eigenschaften ein ist Typ von bool (IsLogged) und ein ist typeof Uri (ProfilePhoto).

XAML:

                                <Image.Source >
                                    <MultiBinding Converter="{StaticResource avatarConverter}">
                                        <Binding Path="ProfilePhoto"></Binding>
                                        <Binding Path="StatusInfo.IsLogged"></Binding>
                                    </MultiBinding>
                                </Image.Source>
                            </Image>

Ich erstelle einen Konverter, der BitmapImage in Graustufen umwandelt, wenn die Eigenschaft IsLogged falsch ist.

Es sieht so aus:

public class AvatarConverter : IMultiValueConverter
{
    public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
    {
        var image = values[0] as BitmapImage;

        string s = values[1].ToString();

        bool isLogged = System.Convert.ToBoolean(s);

        if (!isLogged)
        {
            try
            {
                if (image != null)
                {
                    var grayBitmapSource = new FormatConvertedBitmap();
                    grayBitmapSource.BeginInit();
                    grayBitmapSource.Source = image;
                    grayBitmapSource.DestinationFormat = PixelFormats.Gray32Float;
                    grayBitmapSource.EndInit();
                    return grayBitmapSource;
                }
                return null;

            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        return image;
    }

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

Es funktioniert gut, wenn nur ich auf Bildquelle Eigenschaft Typ fo BitmapImage binden, aber ich brauche Eigenschaft Typ von Uri binden.

Ich habe eine Angst vor der Erstellung Variable BitmapImage in Konverter und als Quelle verwenden Uri. Und diese Variable als Quelle des Bildes zurückgeben. Ich denke, dass dies nicht der ideale Weg ist. Vielleicht liege ich falsch.

Was ist Ihre Meinung

Eine elegante Lösung?

11voto

Thomas Levesque Punkte 277723

Obwohl Sie dies mit einem Konverter tun können, gibt es eine viel bessere Möglichkeit: die Verwendung eines Shader-Effekts. Eine Implementierung eines GreyscaleEffects finden Sie unter diese Seite .

<Style x:Key="grayedIfNotLogged" TargetType="Image">
    <Style.Triggers>
        <DataTrigger Binding="{Binding StatusInfo.IsLogged}" Value="False">
            <Setter Property="Effect">
                <Setter.Value>
                    <fx:GrayscaleEffect />
                </Setter.Value>
            </Setter>
        </DataTrigger>
    </Style.Triggers>
</Style>

...

<Image Source="..." Style="{StaticResource grayedIfNotLogged}" />

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X