2015-01-14 5 views
0

Мне нужен прозрачный текст с непрозрачным фоном с WPF/XAML. Это возможно?WPF прозрачный текст с непрозрачным фоном

Вот пример, но я не использую CSS: css, transparent text with opaque background

Может быть, есть способ, для того, чтобы произвести прозрачный текст с непрозрачным фоном с C#?

Фон должен быть изображение, я попробовал с Canvas:

<Grid> 
    <!-- shows only a black box, but should show red text on black background--> 
    <Canvas Width="100" Height="20" Background="Red"/> 
    <TextBlock Text="My text" Foreground="#00000000" Background="#FF000000"/> 
</Grid> 
+0

Извините, что вы не нашли ответа. Мой проект изменился, и я не смог проверить ответы. Если что-то сработало, добавьте комментарий! –

ответ

1

U может сделать это путем преобразования текста в Path, а затем сделать Clipping на вашем белом Rectangle с этим Path.

Попробуйте это:

<Grid Grid.Row="1"> 
        <Grid.RowDefinitions> 
         <RowDefinition Height="Auto" /> 
         <RowDefinition /> 
        </Grid.RowDefinitions> 

        <TextBox x:Name="textToMask" TextChanged="textToMask_TextChanged" /> 
        <Rectangle Grid.Row="1" x:Name="target" Fill="Yellow"/> 
</Grid> 

C# код

private void textToMask_TextChanged(object sender, TextChangedEventArgs e) 
{ 
    Typeface face = new Typeface("Candara"); 
    FormattedText tx = new FormattedText(textToMask.Text, 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); 
    target.Clip = group; 
} 
+0

Вы имеете в виду, я должен переопределить метод OnRender и использовать drawingContext.DrawGeometry? И нет прямого пути с XAML? –

+0

Нет, просто преобразуйте текст '' '' TextBlock' в Path и сделайте OpacityClipping на холсте или recatngle или что-то еще – safi

+0

это может помочь http://wpf.2000things.com/tag/opacitymask/ – safi

1

Вы можете установить его с помощью Opacity собственности на SolidColorBrush. Он принимает значения от 0 до 1. Где 0 - полная прозрачность и 1 полная непрозрачность. Но если вы установите прозрачный текст, то то, что вы увидите, является фоном текстового поля. В примере я установил частичную непрозрачность, чтобы вы могли видеть, что текст greyish.

<TextBlock Text="Test" Background="Red" Width="100" Height="100"> 
    <TextBlock.Foreground> 
     <SolidColorBrush Opacity="0.25" Color="Black"/> 
    </TextBlock.Foreground> 
</TextBlock> 

Другое дело, чтобы получить прозрачность и видеть фон управления под текстовым блоком, чтобы установить прозрачный передний и частично прозрачный фон.

+0

Частично прозрачный фон будь замечательным, вы могли видеть красное полотно, стоящее за ним сзади. Но эту прозрачность нужно вырезать «text to Path» ^^. Как это работает? –

+0

Что вы имеете в виду, сокращая прозрачность с помощью «text to Path». В зависимости от внешнего управления текстовое поле может быть изменено так, чтобы текст был таким же широким. Таким образом, прозрачность будет такой же широкой, как текстовое поле. – PiotrWolkowski

Смежные вопросы