![](/img/trans.png)
[英]Bind GeometryDrawing Brush To A Custom Control Dependency Property
[英]Custom control inconsistency in border brush property?
我在 WPF 中創建了自己的控件。 最初我將它創建為用戶控件,但發現執行此操作的首選方法是創建一個從控件繼承的 class,然后將我各自的Generic.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
。 我們綁定的border
在哪里? 可視化樹沒有顯示屬於我的控件的邊框。 如果我用硬編碼值替換這兩行,那么我會得到一個邊框。 我懷疑 dll 中可能缺少某些東西,exe 具有諸如樣式或適用於 Border 的東西?
提前感謝您的任何回復以及任何花時間閱讀的人。 干杯,邁克爾
我終於解決了這個問題。 要回答我的第一個問題“當控件模板中沒有定義邊框時,為什么我們在此代碼中使用 Border.BorderBrush”:
BorderBrush="{TemplateBinding Border.BorderBrush}"
Border.BorderBrush 中的邊框在那里,因為依賴屬性是在邊框 class 上定義的。 盡管 Control 具有 BorderBrush 的依賴屬性,但該屬性實際上是在 Border 中定義的。 即,這就是它在 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));
這里的關鍵點是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>
在我將其復制粘貼到我的控件樣式中后,一切都按預期工作。
簡單嘿? :-)))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.