代码之家  ›  专栏  ›  技术社区  ›  Gábor

阴影位于文本上方

  •  2
  • Gábor  · 技术社区  · 6 年前

    我正在给Xamarin.UWP项目添加一个阴影(但问题不是真正的Xamarin特定的,而是UWP的一般情况):

    bool IsShadowSupported => ApiInformation.IsApiContractPresent("Windows.Foundation.UniversalApiContract", 3); // SDK >= 14393
    
    if (IsShadowSupported) {
      var compositor = ElementCompositionPreview.GetElementVisual(Control).Compositor;
      dropShadow = compositor.CreateDropShadow();
      if (Control is Windows.UI.Xaml.Controls.TextBlock textBlock)
        dropShadow.Mask = textBlock.GetAlphaMask();
      shadowVisual = compositor.CreateSpriteVisual();
      shadowVisual.Shadow = dropShadow;
      ElementCompositionPreview.SetElementChildVisual(Control, shadowVisual);
      ...
      dropShadow.Offset = new Vector3((float)Shadow.GetDistanceX(Element), (float)Shadow.GetDistanceY(Element), -5f);
    }
    

    它运行和阴影出现-但上面的文字,而不是下面。起初我以为这是由偏移量的Z坐标决定的,但是没有,没有负值,正值或零值会有任何变化。阴影看起来是这样的:

    enter image description here

    这对它本身并不是一个坏的影响,但它并不是所要求的:白色的文字和下面的深灰色阴影。

    1 回复  |  直到 6 年前
        1
  •  1
  •   Martin Zikmund    6 年前

    问题是 SetElementChildVisual 将视觉设置为给定元素的最后一个子元素,这将使阴影显示在 TextBlock . 不幸的是,连 控件 足够了,您应该有一个相邻的元素来承载阴影:

    <Grid x:Name="ShadowHost" />
    <TextBlock x:Name="Hello" Text="Hello" />
    

    现在使用 ShadowHost 而不是 Control 在你的代码中除了 GetAlphaMask 打电话到你该用的地方 控件 相反。

    当然,这是使阴影起作用的相当多的工作,这就是为什么您可以尝试使用Windows社区工具包的 DropShadowPanel 相反-请参见 documentation 更多信息。