我创建了一个自定义工具提示,其中包含在应用程序启动时或用户更改应用程序主题时加载的.xaml文件中定义的样式。因为工具提示由多个控件使用,每个控件只有轻微的差别,所以我决定创建一个单独的资源字典文件,其中包含所有使用工具提示的控件共有的样式定义。另一方面,我将所有特定于控件的样式放在单独的资源字典文件中。这些文件使用合并字典和对我提到的常见样式的文件的引用。
基本文件包含多个样式定义,并且其中至少有一个定义了样式触发器。当工具提示的依赖项属性HasDropShadow设置为true时,触发器显示阴影。样式在特定于控件的文件中扩展(使用BasedOn属性)。
出于某种原因,当我在Windows Server 2012上运行应用程序时,投影不可见。另一方面,当我在Windows 7上运行应用程序时,投影会按预期显示。我声明绑定的方式有问题,或者Windows是否以任何方式影响工具提示的HasDropShadow属性?
请注意,当我直接设置Effect属性而不使用触发器时,即使在Windows 2012上,投影仍然可见。
您是否了解可能导致此行为的原因?
这是基础StyleBase_User_ToolTip.xaml文件(我从中删除了不相关的内容):
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:Client="clr-namespace:Client;assembly=Client">
<Style x:Key="ToolTipBorderBase" TargetType="Border">
<Setter Property="Padding" Value="10,10,10,10" />
<Setter Property="BorderThickness" Value="0" />
<Setter Property="Background">
<Setter.Value>
<ImageBrush ImageSource="Images\User_ToolTip\background_bar.png" />
</Setter.Value>
</Setter>
<!--drop shadow visibility-->
<Style.Triggers>
<DataTrigger Binding="{Binding RelativeSource={RelativeSource AncestorType=Client:User_ToolTip}, Path=HasDropShadow}" Value="True">
<Setter Property="Effect">
<Setter.Value>
<DropShadowEffect BlurRadius="5" Opacity="0.4"/>
</Setter.Value>
</Setter>
</DataTrigger>
</Style.Triggers>
</Style>
<Style x:Key="ToolTipContent" TargetType="Client:User_ToolTip">
<Setter Property="ToolTipService.Placement" Value="Left" />
<Setter Property="StaysOpen" Value="True" />
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type Client:User_ToolTip}">
<Border Style="{DynamicResource ToolTipBorder}">
<StackPanel Style="{StaticResource ToolTipContentContainer}">
...
</StackPanel>
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</ResourceDictionary>
这是一个特定于控件的文件:
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:Client="clr-namespace:Client;assembly=Client">
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="StyleBase_User_ToolTip.xaml" />
<ResourceDictionary>
<Style x:Key="ToolTipBorder" TargetType="Border" BasedOn="{StaticResource ToolTipBorderBase}">
<Setter Property="Margin" Value="2,0,8,8" />
</Style>
</ResourceDictionary>
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
谢谢!
答案 0 :(得分:0)
我想我找到了答案。在我的例子中,我将投影的触发器绑定到我的工具提示的内置HasDropShadow属性。我在运行时将其值赋值为True,但Windows Server 2012没有显示投影,而不是Windows 7。
但是,当我声明一个单独的依赖项属性来指示是否应该显示阴影,并将上面提到的触发器绑定到它时,Windows Server 2012会正确显示投影。
所以,我是否正确,某些依赖属性可能具有完全由操作系统控制的值?
BTW,我忘了提到我的客户端:User_ToolTip是System.Windows.Controls.ToolTip的后代。