Как сделать текст WPF на фоне стекла Aero читабельным? - PullRequest
10 голосов
/ 06 ноября 2010

У меня есть приложение WPF, которое рисует текст на фоне стекла Aero. Проблема заключается в том, что на основании того, что отображается за моим приложением, текст, нарисованный на стеклянном фоне, может стать трудночитаемым или просто невозможным для чтения.

Как видно на следующем снимке экрана, текстовые блоки Сохранить , Отменить и Повторить становятся трудночитаемыми, если окно позади мое приложение темное.

alt text

Теперь приложения Microsoft, такие как Word, решают эту проблему с помощью размытия текста, как вы можете видеть на следующем снимке экрана:

alt text

Я слышал, что есть какой-то вызов Win32 API, который я могу сделать, чтобы заставить это работать. Тем не менее, это просто слухи для меня на данный момент, у меня нет фактов, чтобы подтвердить это.


Я пробовал несколько разных вещей, специфичных для WPF, чтобы приблизиться к тому, что делает Word:

  • Тени на тексте
  • Прозрачные изображения текста с размытостью, запеченной в (вместо TextBlock)

Ни один из них не дает мне полезных результатов, все они выглядят довольно вялыми. Кто-нибудь знает какой-либо метод, WPF или Win32, который я мог бы использовать для рисования текста, как это делает Microsoft на стекле (, т.е. , для чтения )?

Ответы [ 3 ]

8 голосов
/ 07 ноября 2010

Я смог решить эту проблему без Win32 (требуется .NET 3.5).

 <Grid>
     <TextBlock Foreground="Black" HorizontalAlignment="Center" Margin="0,10,30,0" Text="Text that should be visible on Aero Glass">
         <TextBlock.Effect>
            <BlurEffect Radius="15" KernelType="Gaussian">                                                                    
            </BlurEffect>                                        
         </TextBlock.Effect>
      </TextBlock>
      <TextBlock HorizontalAlignment="Center" Foreground="White" Margin="0,10,30,0" Text="Text that should be visible on Aero Glass">
      </TextBlock>
 </Grid>

Этот код имеет эффект удвоения текста и размытия версии текста, который находится дальше, Z-Индекс мудрый.Для меня это работает как шарм.

Одна вещь, на которую стоит обратить внимание:
Это лучше всего работает, если цвет текста белый, а цвет размытия - черный.С другой стороны, это выглядит не так хорошо.Хорошей новостью является то, что она выглядит хорошо, независимо от того, что находится за окном Aero Glass.

3 голосов
/ 09 марта 2011

В случае, если кто-то ищет другой пример, попробуйте это с обратной поддержкой не-стекла:

Использование:

Style="{StaticResource glassText}"

Идет в словаре ресурсов:

 <Style TargetType="TextBlock" x:Key="glassText">
    <Setter Property="Foreground" Value="Black" />
    <Style.Triggers>
        <Trigger Property="Foreground" Value="Black">
            <Setter Property="Effect">
                <Setter.Value>
                    <DropShadowEffect Color="White" BlurRadius="10" RenderingBias="Performance" ShadowDepth="0" Direction="0" />
                </Setter.Value>
            </Setter>
        </Trigger>
    </Style.Triggers>
</Style>
<Style TargetType="TextBlock" x:Key="glassLink" BasedOn="{StaticResource glassText}">
    <Setter Property="Foreground" Value="#FF0066CC" />
    <Style.Triggers>
        <Trigger Property="IsMouseOver" Value="True">
            <Setter Property="Cursor" Value="Hand" />
            <Setter Property="TextDecorations" Value="Underline" />
        </Trigger>
        <Trigger Property="IsEnabled" Value="False">
            <Setter Property="Foreground" Value="{x:Static SystemColors.GrayTextBrush}" />
        </Trigger>
    </Style.Triggers>
</Style>
3 голосов
/ 06 ноября 2010

Функция Win32, которую вы ищете, это DrawThemeTextEx. У него есть флаг, который позволяет рисовать текст с белым свечением / размытием на заднем плане. Вы можете найти пример здесь: C # Прозрачный графический интерфейс

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...