Ответ 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);
}
}