【问题标题】:c# uwp templatebinding and dependency propertyc# uwp模板绑定和依赖属性
【发布时间】:2017-12-04 14:48:08
【问题描述】:

在 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 但也没有运气。

问题出在哪里?

【问题讨论】:

  • Content 中的TooltipPlacement="{TemplateBinding Content}" 是什么?
  • 我在复制粘贴时出错...应该是:
  • set { SetValue(TooltipPlacementProperty, value); SetValue(); } 中的SetValue() 是什么?执行其他操作是否是函数重载?
  • 即绑定设置属性值后执行的方法。在该方法中,我将放置用于计算箭头可见性的逻辑。
  • 据我了解,DataBinding 不适用于TooltipPlacement。我对吗?另外,在您的问题中添加您的最后一条评论

标签: c# binding uwp dependency-properties templatebinding


【解决方案1】:

您非常接近,除了您认为依赖属性错误的方式。

你永远不应该修改它的 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();
}

【讨论】:

  • 但是无论如何绑定部分都没有执行。我已经设置了断点来检查,但没有运气。
  • @user3239349 你一定在其他地方做错了什么。我创建了一个与您描述的完全一样的项目,它运行良好。要么用更多代码编辑问题,要么向我提供一个 repo,以便我进行测试。
  • 按照您现在的工作方式编辑依赖属性。谢谢,这是我的代码中唯一的问题。
  • 你可能知道为什么 PlacementMode 总是顶部,不管工具提示显示在控制之下还是之上?
  • 可能底部空间不够?无论如何,你能发布另一个更详细的问题吗?
猜你喜欢
  • 2018-05-21
  • 1970-01-01
  • 2014-04-10
  • 2012-01-19
  • 1970-01-01
  • 1970-01-01
  • 2016-01-22
  • 2012-11-08
  • 2012-08-01
相关资源
最近更新 更多