簡體   English   中英

邊框畫筆屬性中的自定義控件不一致?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM