Водяной знак с использованием класса Джона Мычека - PullRequest
2 голосов
/ 22 марта 2011

Эй, я попытался реализовать класс, созданный Джоном Водяной знак .

Я застрял и подумал, может ли кто-нибудь мне помочь .... Добавил 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 отсутствует .... но я не могу найти его, чтобы добавить его ...

Любая помощь, высоко ценится.

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

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

1 Ответ

6 голосов
/ 23 марта 2011

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

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

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

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);
  }
}
...