c# uwp 模板绑定和依赖 属性

c# uwp templatebinding and dependency property

在 UWP 中,我正在尝试更改工具提示的默认模板。

我已经做到了,但现在我需要设置工具提示箭头指向它所属的控件。

我的风格是这样定义的:

    <Style TargetType="ToolTip">
        <Setter Property="Foreground" Value="White" />
        <Setter Property="Background" Value="{ThemeResource SystemControlBackgroundChromeMediumLowBrush}" />
        <Setter Property="BorderBrush" Value="{ThemeResource SystemControlForegroundChromeHighBrush}" />
        <Setter Property="BorderThickness" Value="{ThemeResource ToolTipBorderThemeThickness}" />
        <Setter Property="FontFamily" Value="Roboto" />
        <Setter Property="FontSize" Value="{ThemeResource ToolTipContentThemeFontSize}" />
        <Setter Property="Padding" Value="40,40,40,35"/>

        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="ToolTip">

                    <Grid Background="Transparent">

                        <Grid 
                            MinWidth="100"
                            MinHeight="90"
                            Height="{TemplateBinding Height}"
                            Width="{TemplateBinding Width}" 
                            Padding="15" 
                            Background="Transparent">

以此类推...

但现在我正在尝试使 UserControl 与 TemplateBinding 绑定 属性。

我创建了具有一定依赖性的 UserControl 属性。 像这样:

    public PlacementMode TooltipPlacement
    {
        get { return (PlacementMode)GetValue(TooltipPlacementProperty); }
        set { SetValue(TooltipPlacementProperty, value);  CalculateArrowVisibility(); }
    }

    public static readonly DependencyProperty TooltipPlacementProperty =
        DependencyProperty.Register("TooltipPlacement", typeof(PlacementMode), typeof(ArrowDown), null);

CalculateArrowVisibility() 是一种根据 TooltipPlacement 计算箭头位置的方法。

并且该控件的样式定义如下:

<local:ArrowDown x:Name="arrow" TooltipPlacement="{TemplateBinding Placement}"/>

但是没有绑定,我试过其他的TemplateProperties也没有成功。

这里的问题在哪里?

你非常接近 expet 你删除依赖项的方式 属性 是错误的。

您永远不应修改其 getter 和 setter。相反,在其 属性 更改的回调中调用您的 CalculateArrowVisibility 方法,如下所示 -

public PlacementMode TooltipPlacement
{
    get => (PlacementMode)GetValue(TooltipPlacementProperty);
    set => SetValue(TooltipPlacementProperty, value);
}
public static readonly DependencyProperty TooltipPlacementProperty =
    DependencyProperty.Register("TooltipPlacement", typeof(PlacementMode), typeof(ArrowDown), 
        new PropertyMetadata(null, TooltipPlacementChangedCallback));

private static void TooltipPlacementChangedCallback(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
    var self = (ArrowDown)d;
    self.CalculateArrowVisibility();
}