Я попробовал пример, и он работает для меня.
Однако я заметил следующее:
Классы не указали пространство имен, поэтому я добавил один для обоих классов.В моем случае «Водяной знак».
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);
}
}