silverLight: OpacityMask не будет применяться к пользовательскому элементу управления - PullRequest
1 голос
/ 15 октября 2011

Я затушевываю изображения на отключенных пользовательских элементах управления ImageButton, применяя OpacityMask к Overlay. Предполагаемый эффект состоит в том, что только тело изображения становится серым, поэтому над изображением не накладываются рамки или рамки.

Проблема в том, что, поскольку к URI-изображению обращаются через связанный получатель (вещь, написанная в {TemplateBinding XXX}), маска неприменима. Однако, если URI указан явно, маска будет работать. Поэтому вопрос в том, почему проблема возникает в случае TmplateBinding и как ее решить.

Код XAML, определяющий пользовательскую кнопку изображения:

            <my1:ImageButton Height="24" Width="24" x:Name="imageButton1" IsEnabled="False" ImageSource="/SilverlightApplication4;component/Undo_24x24.png" Margin="178,75,198,201">
            <Image Source="/SilverlightApplication4;component/Undo_24x24.png" Height="24" Width="24" />
        </my1:ImageButton>

Код обработчика пользовательских свойств:

    public class ImageButton: Button
{
    public static readonly DependencyProperty ImageSourceProperty = DependencyProperty.Register("ImageSource", typeof(ImageSource), typeof(ImageButton), new PropertyMetadata(null));
    public ImageSource ImageSource
    {
        get
        {
            return (ImageSource)this.GetValue(ImageSourceProperty);
        }
        set
        {
            this.SetValue(ImageSourceProperty, value);
        }
    }
}

Код стиля пользовательского элемента управления (отключенное состояние):

                            <Rectangle x:Name="DisabledVisualElement" Fill="Red" Opacity="0" >
                            <Rectangle.OpacityMask>
                                <ImageBrush ImageSource="{TemplateBinding ImageSource}"/>                                   
                            </Rectangle.OpacityMask>
                        </Rectangle>

Интересно, что оба следующих фрагмента кода размещены внутри шаблона стиля

<Image Source="{TemplateBinding ImageSource}" Height="24" Width="24" />

а также

                            <Rectangle x:Name="DisabledVisualElement" Fill="Red" Opacity="0" >
                            <Rectangle.OpacityMask>
                                <ImageBrush ImageSource="/SilverlightApplication4;component/Undo_24x24.png"/>                                   
                            </Rectangle.OpacityMask>
                        </Rectangle>

оба работают правильно. Таким образом, проблема заключается в том, что ImageSource = "{TemplateBinding ImageSource}" почему-то не получает правильный URI или не работает по какой-то другой причине. Итак, как это исправить?

1 Ответ

0 голосов
/ 13 января 2012

TemplateBinding не так полно, как обычная привязка.TemplateBinding не может автоматически преобразовать строку / uri в фактическое растровое изображение.

Решение (используйте обычную привязку):

<Rectangle x:Name="DisabledVisualElement" Fill="Red" Opacity="0" >
    <Rectangle.OpacityMask>
        <ImageBrush ImageSource="{Binding Path=ImageSource, RelativeSource={RelativeSource TemplatedParent}}"/>                                   
    </Rectangle.OpacityMask>
</Rectangle>
...