Windows Server 2012上的自定义WPF工具提示中没有投影

时间:2015-07-15 11:26:06

标签: wpf xaml resourcedictionary

我创建了一个自定义工具提示,其中包含在应用程序启动时或用户更改应用程序主题时加载的.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>

谢谢!

1 个答案:

答案 0 :(得分:0)

我想我找到了答案。在我的例子中,我将投影的触发器绑定到我的工具提示的内置HasDropShadow属性。我在运行时将其值赋值为True,但Windows Server 2012没有显示投影,而不是Windows 7。

但是,当我声明一个单独的依赖项属性来指示是否应该显示阴影,并将上面提到的触发器绑定到它时,Windows Server 2012会正确显示投影。

所以,我是否正确,某些依赖属性可能具有完全由操作系统控制的值?

BTW,我忘了提到我的客户端:User_ToolTip是System.Windows.Controls.ToolTip的后代。