Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Wpf 边界笔刷属性中的自定义控件不一致?_Wpf_Wpf Controls_Controltemplate_Generic.xaml - Fatal编程技术网

Wpf 边界笔刷属性中的自定义控件不一致?

Wpf 边界笔刷属性中的自定义控件不一致?,wpf,wpf-controls,controltemplate,generic.xaml,Wpf,Wpf Controls,Controltemplate,Generic.xaml,我已经在WPF中创建了自己的控件。最初,我将其创建为usercontrol,但发现实现这一点的首选方法是创建一个继承自control的类,然后将我各自的xaml放在Generic.xaml中的控件模板中 当它在我的exe中时,它工作得很好,但当我将它移动到dll时,边框从我的控件中消失了。我的控件基于一个文本框,它几乎是文本框控件模板的复制和粘贴,添加了一个用户可以单击的按钮 我已经确定了控件模板中不起作用的相关部分,即下面的BorderBrush=“{TemplateBinding Borde

我已经在WPF中创建了自己的控件。最初,我将其创建为usercontrol,但发现实现这一点的首选方法是创建一个继承自control的类,然后将我各自的xaml放在
Generic.xaml
中的控件模板中

当它在我的exe中时,它工作得很好,但当我将它移动到dll时,边框从我的控件中消失了。我的控件基于一个文本框,它几乎是文本框控件模板的复制和粘贴,添加了一个用户可以单击的按钮

我已经确定了控件模板中不起作用的相关部分,即下面的
BorderBrush=“{TemplateBinding Border.BorderBrush}”
位以及下一行

<Style TargetType="{x:Type local:ButtonBox}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type local:ButtonBox}">
                <mwt:ListBoxChrome 
                        Background="{TemplateBinding Panel.Background}"
                        BorderBrush="{TemplateBinding Border.BorderBrush}"
                        BorderThickness="{TemplateBinding Border.BorderThickness}"
                        RenderMouseOver="{TemplateBinding UIElement.IsMouseOver}"
                        RenderFocused="{TemplateBinding UIElement.IsKeyboardFocusWithin}"
                        Name="Bd"
                        SnapsToDevicePixels="True">

我理解模板绑定,但不理解为什么要绑定到
Border.BorderBrush
。我们绑定到的
边界在哪里?可视化树不显示作为控件一部分的边框。如果我用硬编码的值替换这两行,那么就会得到一个边框。我怀疑exe的dll中可能缺少一些东西,例如样式或应用于Border的东西

提前感谢您的回复和任何花时间阅读的人。 干杯
迈克尔

我终于解决了这个问题。要回答我的第一个问题“当控件模板中没有定义边框时,为什么在代码中使用Border.BorderBrush”:

border.BorderBrush中存在边框,因为依赖项属性是在border类上定义的。虽然控件具有BorderBrush的依赖属性,但该属性实际上是在Border中定义的。也就是说,这是如何定义的边界

BorderBrushProperty = DependencyProperty.Register("BorderBrush", typeof(Brush), typeof(Border), new FrameworkPropertyMetadata(null, FrameworkPropertyMetadataOptions.SubPropertiesDoNotAffectRender | FrameworkPropertyMetadataOptions.AffectsRender, new PropertyChangedCallback(Border.OnClearPenCache)));
这就是它在控制中的使用方式

BorderBrushProperty = Border.BorderBrushProperty.AddOwner(typeof(Control), new FrameworkPropertyMetadata(Border.BorderBrushProperty.DefaultMetadata.DefaultValue, FrameworkPropertyMetadataOptions.None));
这里的关键点是控件不定义自己的BorderBrush依赖属性,而是使用AddOwner将自己与现有的依赖属性相关联。这就是为什么它在控件模板中定义为Border.BorderBrush,即使文本框在其控件模板中没有边框

我的第二个问题“此值集在哪里”的答案是,它是以文本框的默认样式设置的。我可以通过以下操作查看文本框的默认样式:

            var style = (Style)Application.Current.TryFindResource(typeof(TextBox));
            if (style == null) return;
            XmlWriterSettings settings = new XmlWriterSettings();
            settings.Indent = true;
            StringBuilder sb = new StringBuilder();
            XmlWriter writer = XmlWriter.Create(sb, settings);
            XamlWriter.Save(style, writer);
            MessageBox.Show(sb.ToString());
一旦我们运行了这段代码,我们可以在样式中看到这两个属性都是硬编码的。这对我来说似乎很奇怪,但这显然是一直以来的做法

  <Setter Property="Border.BorderBrush">
    <Setter.Value>
      <LinearGradientBrush StartPoint="0,0" EndPoint="0,20" MappingMode="Absolute">
        <LinearGradientBrush.GradientStops>
          <GradientStop Color="#FFABADB3" Offset="0.05" />
          <GradientStop Color="#FFE2E3EA" Offset="0.07" />
          <GradientStop Color="#FFE3E9EF" Offset="1" />
        </LinearGradientBrush.GradientStops>
      </LinearGradientBrush>
    </Setter.Value>
  </Setter>
  <Setter Property="Border.BorderThickness">
    <Setter.Value>
      <Thickness>1,1,1,1</Thickness>
    </Setter.Value>
  </Setter>

1,1,1,1
在我将其复制粘贴到我的控件样式中后,一切都按预期工作


简单的嘿?:-))

我认为您应该看到
TextBox
default
Template
。据我所知,将近90%的控件使用
Border
作为第一个
模板
标记。可能是你的“影子”边界?还可以尝试UI调试器。您已接近。答案是查看文本框的默认样式,而不是模板。其中包含相关信息。
  <Setter Property="Border.BorderBrush">
    <Setter.Value>
      <LinearGradientBrush StartPoint="0,0" EndPoint="0,20" MappingMode="Absolute">
        <LinearGradientBrush.GradientStops>
          <GradientStop Color="#FFABADB3" Offset="0.05" />
          <GradientStop Color="#FFE2E3EA" Offset="0.07" />
          <GradientStop Color="#FFE3E9EF" Offset="1" />
        </LinearGradientBrush.GradientStops>
      </LinearGradientBrush>
    </Setter.Value>
  </Setter>
  <Setter Property="Border.BorderThickness">
    <Setter.Value>
      <Thickness>1,1,1,1</Thickness>
    </Setter.Value>
  </Setter>