0

我开发了一个具有依赖属性的自定义控件

public static readonly DependencyProperty StateBorderBrushProperty =
        DependencyProperty.Register("StateBorderBrush", typeof(Brush), typeof(SmartCanvas),
        new FrameworkPropertyMetadata(Brushes.Transparent,
            FrameworkPropertyMetadataOptions.None));

当我尝试从外部 xaml 设置控件的 ControlTemplate 时出现问题

<ControlTemplate TargetType="controls:SmartPrimitive">
                    <Grid>
                        <ContentPresenter/>
                        <Border BorderBrush="{TemplateBinding StateBorderBrush}" BorderThickness="2"/>
                    </Grid>
                </ControlTemplate>

听起来像上面带有 TemplateBinding 的字符串中的“XamlParseException:字典中不存在给定的键”。有什么问题?

4

3 回答 3

1

你错过了{x:Type }声明

<ControlTemplate TargetType="{x:Type controls:SmartPrimitive}">
     <Grid>
         <ContentPresenter/>
         <Border BorderBrush="{TemplateBinding StateBorderBrush}" BorderThickness="2"/>
     </Grid>
</ControlTemplate>

这意味着您正在为 TargetType 而不是 Type 提供字符串

x:Type 标记扩展为采用 Type 类型的属性提供从字符串转换行为。输入是 XAML 类型。

http://msdn.microsoft.com/en-us/library/ms753322%28v=vs.110%29.aspx

于 2014-11-28T15:32:32.877 回答
1

我只是拼错了 DependencyProperty 所有者的类型。它应该是 SmartPrimitive,而不是 SmartCanvas。但是... WPF 异常可能会提供更多信息。

于 2014-11-29T16:09:26.907 回答
0

在类似的情况下,我遇到了类似的问题。于是搜了一下,发现这种情况下不能是TemplateBinding。

就像这里 Sivasubramanian 的回答和解释一样->在 ControlTemplate.Triggers 中使用 TemplateBinding

在 TemplateBinding 中:仔细看看,Max:MyControl.Bar 的解析值将充当模板绑定的资源键 [这里 Bar 的值不是实际值,而是属性键名称] 不存在,因此会引发错误“给定的键不在字典中”。

所以基本上,将 TemplateBinding 更改为 Binding

<ControlTemplate TargetType="{x:Type controls:SmartCanvas}">
 <Grid>
     <ContentPresenter/>
     <Border BorderBrush="{Binding StateBorderBrush, UpdateSourceTrigger=PropertyChanged}" BorderThickness="2"/>
 </Grid>
于 2021-01-03T14:18:34.927 回答