gpt4 book ai didi

wpf - 自定义控件边框画笔属性不一致?

转载 作者:行者123 更新时间:2023-12-03 01:07:40 26 4
gpt4 key购买 nike

我在 WPF 中创建了自己的控件。最初,我将其创建为用户控件,但发现执行此操作的首选方法是创建一个继承自控件的类,然后将我各自的 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">

我了解模板绑定(bind),但我不明白为什么我们要绑定(bind)到 Border.BorderBrush。我们绑定(bind)的border在哪里?可视化树没有显示属于我的控件一部分的边框。如果我用硬编码值替换这两行,那么我会得到一个边框。我怀疑 exe 的 dll 中可能缺少某些内容,例如样式或适用于边框的内容??

预先感谢您的回复以及任何花时间阅读的人。干杯,迈克尔

最佳答案

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

BorderBrush="{TemplateBinding Border.BorderBrush}"

Border.BorderBrush 中的边框之所以存在,是因为依赖属性是在 Border 类上定义的。尽管 Control 具有 BorderBrush 的依赖属性,但该属性实际上是在 Border 中定义的。即,这就是它在 Border 中的定义方式

BorderBrushProperty = DependencyProperty.Register("BorderBrush", typeof(Brush), typeof(Border), new FrameworkPropertyMetadata(null, FrameworkPropertyMetadataOptions.SubPropertiesDoNotAffectRender | FrameworkPropertyMetadataOptions.AffectsRender, new PropertyChangedCallback(Border.OnClearPenCache)));

这就是它在 Control 中的使用方式

BorderBrushProperty = Border.BorderBrushProperty.AddOwner(typeof(Control), new FrameworkPropertyMetadata(Border.BorderBrushProperty.DefaultMetadata.DefaultValue, FrameworkPropertyMetadataOptions.None));

这里的关键点是 Control 没有定义自己的 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>

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

简单吗? :-)))

关于wpf - 自定义控件边框画笔属性不一致?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6621195/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com