Установите альфа-прозрачность содержимого метки WPF вместо прозрачности всего элемента управления

Я пытаюсь сделать содержимое метки невидимым, чтобы я мог наложить это на содержимое позади. Например, фон элемента управления имеет сплошной цвет, но текст имеет альфа-прозрачность, что позволяет мне видеть весь элемент управления (как трюк с фотошопом). Таким образом, динамический контент можно будет увидеть на переменном фоне. Я применяю этот шаблон с файлами PNG, но этого явно не будет, когда нужно изменить содержимое. Отличный пример этого вопроса (так как я не очень хорошо его задаю) можно найти здесь ... но, конечно, это для css. (Как сделать видимым текст?) Любая помощь по этому поводу будет оценил


person UnOjO2010    schedule 03.01.2016    source источник
comment
Некоторое время это был мой собственный вопрос ... Маскировка текста из фона границы. Есть способ добиться этого, но он не требует использования метки. с помощью кода позади вы можете определить OpacityMask для границы, удаляющей текст.   -  person uncommon_name    schedule 03.01.2016
comment
Я не уверен, что понимаю. Я понимаю использование opacitymask, но до сих пор мои попытки использовать его в этом UserControl были безуспешными. Я просто попробовал это в коде, но безрезультатно. Что мы помещаем в рамку, чтобы текст был прозрачным? TextBlock? Я пробовал несколько комбинаций на основе вашего предложения, но мне все еще нечего показать. :(   -  person UnOjO2010    schedule 03.01.2016
comment
я пытаюсь сказать, что я уверен, что мы можем визуализировать текстовый блок с помощью техники (stackoverflow.com/a/28626055/ 4805219), если бы мы могли только изменить пиксели результирующих объектов BitmapSource, инвертировать их альфа-канал и установить его как OpacityMask, это сработало бы! :)   -  person uncommon_name    schedule 03.01.2016


Ответы (1)


Итак, я нашел решение этой проблемы ... Хитрость в том, чтобы использовать Clip вместо OpacityMask.

Сначала посмотрите на макет:

<Grid Background="Red">
    <Border Background="White" Name="targetImage" VerticalAlignment="Center" Height="200"/>

    <Button VerticalAlignment="Bottom" Content="render" Click="ButtonBase_OnClick"></Button>
</Grid>

Здесь сетку с красным фоном можно использовать в качестве фонового изображения! Граница внутри покрывает его белым цветом. Затем я помещаю кнопку, которая при нажатии удаляет нужный нам текст с границы.

вот код события нажатия кнопки:

private void ButtonBase_OnClick(object sender, RoutedEventArgs e)
    {
        Typeface face = new Typeface("Candara");
        FormattedText tx = new FormattedText("Hello", Thread.CurrentThread.CurrentUICulture, FlowDirection.LeftToRight, face, 70, Brushes.Black);
        Geometry textGeom = tx.BuildGeometry(new Point(0, 0));
        Rect boundingRect = new Rect(new Point(-100000, -100000), new Point(100000, 100000));
        RectangleGeometry boundingGeom = new RectangleGeometry(boundingRect);
        GeometryGroup group = new GeometryGroup();
        group.Children.Add(boundingGeom);
        group.Children.Add(textGeom);
        targetImage.Clip = group;   


    }

По сути, это создание текста! тогда нам нужно инвертировать маску. инвертирование выполняется с помощью boundingRect.

Изменить: почти забыл. Вы можете поместить всю эту логику в пользовательский элемент управления. и запускайте этот код каждый раз, когда изменяется свойство Text вашего Usercontrol.

развлекайся ;)

person uncommon_name    schedule 03.01.2016
comment
Как, черт возьми, вы так быстро нашли ответ на этот вопрос? Гений! Я все еще переворачивал логику в Visual. Я делал это раньше с помощью снимка экрана с оптическим распознаванием символов и знал, что это за стратегия. Но это гениально !! +200 :) Большое спасибо, уже часами занимаюсь этим! :П - person UnOjO2010; 03.01.2016
comment
Проголосовать за использование того же кода и имен переменных, что и в ответе, датированном 1 годом ранее. stackoverflow.com/a/27942156/2353523 - person soulshined; 31.07.2018