水印使用John Myczek的课程

时间:2011-03-22 20:20:08

标签: c# wpf watermark

嘿,我尝试实施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 个答案:

答案 0 :(得分:6)

我尝试了这个例子,它对我有用。

但是,我确实注意到以下情况:

这些类没有指定命名空间,所以我为这两个类添加了一个。在我的案例中“水印”。

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>

除了删除边距和对齐外,它与您的基本相同。

这有帮助吗?

作为旁注,我不喜欢在组合框中选择项目时水印仍然显示的事实,因此我更改了WatermarkService中的Control_Loaded方法,如下所示:

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