c# - Datatrigger 绑定(bind)到 ControlTemplate 和 ContentPresenter 中样式 TargetType 的属性

标签 c# wpf controltemplate datatrigger

我正在为 WPF 工具提示创建样式。工具提示是一个文本框,其中的箭头指向拥有该工具提示的控件。箭头需要位于文本框的左侧或右侧,具体取决于 ToolTip.Placement 是“右”还是“左”。

为此,我创建了向右和向左箭头,并尝试使用数据触发器绑定(bind)到 Placement 属性,以便可以设置箭头的可见性。

现在,两个箭头始终显示。我认为我的数据触发器未设置为绑定(bind)到工具提示的 Placement 属性,但我不知道出了什么问题。

     <Style TargetType="ToolTip">
        <Setter Property="Placement" Value="Right" />
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="ToolTip">
                    <ContentPresenter>
                        <ContentPresenter.Content>
                            <StackPanel Orientation="Horizontal" >

                                <Path x:Name="LeftArrow" Fill="DarkOrange" Data="M 0 0 L 12 9 L 12 -9 Z" VerticalAlignment="Center" Stretch="Uniform">
                                    <Path.Style>
                                        <Style TargetType="Path">
                                            <Style.Triggers>
                                                <DataTrigger Binding="{Binding Placement}" Value="Right">
                                                    <Setter Property="Visibility" Value="Collapsed" />
                                                </DataTrigger>
                                            </Style.Triggers>
                                        </Style>
                                    </Path.Style>
                                </Path>

                                <TextBox Background="DarkOrange" Height="50" Width="50" />

                                <Path x:Name="RightArrow" Fill="DarkOrange" Data="M 0 0 L -12 -9 L -12 9 Z" VerticalAlignment="Center" Stretch="Uniform">
                                    <Path.Style>
                                        <Style TargetType="Path">
                                            <Style.Triggers>
                                                <DataTrigger Binding="{Binding Placement}" Value="Right">
                                                    <Setter Property="Visibility" Value="Collapsed" />
                                                </DataTrigger>
                                            </Style.Triggers>
                                        </Style>
                                    </Path.Style>
                                </Path>

                            </StackPanel>
                        </ContentPresenter.Content>
                    </ContentPresenter>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>

最佳答案

模板被覆盖,因此您需要使用TemplatedParent。检查左值或右值,因为在这两种情况下,DataTrigger 都会检查右值。

<Path x:Name="RightArrow" Fill="DarkOrange" Data="M 0 0 L -12 -9 L -12 9 Z" VerticalAlignment="Center" Stretch="Uniform">
    <Path.Style>
             <Style TargetType="Path">
              <Style.Triggers>
                <DataTrigger Binding="{Binding RelativeSource={RelativeSource TemplatedParent},Path=Placement}" Value="Right">
                  <Setter Property="Visibility" Value="Collapsed" />
                </DataTrigger>
              </Style.Triggers>
             </Style>
      </Path.Style>
</Path>

关于c# - Datatrigger 绑定(bind)到 ControlTemplate 和 ContentPresenter 中样式 TargetType 的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31481573/

相关文章:

wpf - 来自静态资源的WPF窗口标题

.net - 获取 WPF 路径中所有点的像素位置

c# - VU Meter 像 Windows 音量混合器

更改可见性时 WPF 触发动画?

c# - 具有多种日期时间表示形式的 CultureInfo

c# - .net 核心中的 System.DirectoryServices.AccountManagement

c# - 将字节数组转换为位图图像

WPF 验证控制模板重叠

wpf - 如何绑定(bind)到 ControlTemplate 内的元素?

c# - Entity Framework 核心存储库模式 - 重复检查