Водяной знак с использованием класса John Myczek

Эй, я попробовал реализовать класс John, сделанный Watermark.

Я застрял и подумал, может ли кто-нибудь помочь мне.... Добавлено 2 класса, упомянутых и на wpf:

<AdornerDecorator>
        <ComboBox Height="23" HorizontalAlignment="Right" Margin="0,184,664,0" x:Name="cbVideoDevices" VerticalAlignment="Top" Width="316" Initialized="cbVideoDevices_Initialized" SelectionChanged="cbVideoDevices_SelectionChanged">
            <Controls:WatermarkService.Watermark>
                <TextBlock>Type here to search text</TextBlock>
            </Controls:WatermarkService.Watermark>
        </ComboBox>
    </AdornerDecorator>

Что бы я ни пытался, я продолжаю получать ошибки, поскольку элемент управления не существует, или свойство не выходит. У меня нет ошибок в его классах, поэтому я понял, что ссылки хороши, но мне показалось, что System.Windows.Control отсутствует.... но я не могу найти его, чтобы добавить его...

Любая помощь, очень ценная.

Изменить: с помощью Liz я получил это, чтобы работать, но чтобы кто-нибудь знал, кто это использует.

  • AdornerDecorator Создает поле над всем.....
  • Создайте маржу для AdornerDecorator и переместите ее в нужную позицию.
  • Поля и выравнивание винта с изображением водяного знака....

Ответ 1

Я попробовал этот пример, и он работает для меня.

Однако я заметил следующее:

В классах не указано пространство имен, поэтому я добавил один для обоих классов. В моем случае "Водяной знак".

namespace Watermark
{
  public static class WatermarkService
  {
   ...
  }
}

Класс WatermarkAdorner во "внутреннем", но это не должно вас беспокоить, если оно не находится в другой сборке (dll). Если он затем сделает его "общедоступным"

Затем в xaml я добавил объявление пространства имен

xmlns:Controls="clr-namespace:Watermark"

В этот момент все работало нормально.

Мой слегка упрощенный xaml выглядит так:

<AdornerDecorator >
      <ComboBox Height="23"  x:Name="cbVideoDevices"   
                             Initialized="cbVideoDevices_Initialized"                       
                             SelectionChanged="cbVideoDevices_SelectionChanged">
        <controls:WatermarkService.Watermark>
          <TextBlock>Type here to search text</TextBlock>
        </controls:WatermarkService.Watermark>
      </ComboBox>
    </AdornerDecorator>

Помимо удаления полей и выравнивания, они в основном такие же, как у вас.

Помогает ли это?

В качестве побочного примечания мне не понравилось, что водяной знак все еще показывался, когда элемент был выбран в поле со списком, поэтому я изменил метод Control_Loaded в WatermarkService следующим образом:

private static void Control_Loaded(object sender,RoutedEventArgs e)
{
  Control control = (Control)sender;
  if(ShouldShowWatermark(control))
  {
    ShowWatermark(control);
  }
  else
  {
    RemoveWatermark(control);
  }
}