首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> 關於.NET

WPF 日歷控件開發實戰(二):自定義樣式屬性與依賴屬性模式

     編輯:關於.NET

接續上篇:Header 區域的 TitleStyle 自定義

1. 依賴屬性定義標準樣式

/// <summary>
/// TitleStyle 依賴屬性
/// </summary>
public static readonly DependencyProperty TitleStyleProperty =
    DependencyProperty.Register(
        "TitleStyle",
        typeof(Style),
        typeof(MonthCalendar),
        new FrameworkPropertyMetadata((Style)null));

public Style TitleStyle
{
    get { return (Style)GetValue(TitleStyleProperty); }
    set { SetValue(TitleStyleProperty, value); }
}

預設為 null,指定樣式時覆蓋預設樣式。

2. 導航按鈕樣式:PreviousButtonStyle / NextButtonStyle

為前進/後退按鈕定義獨立樣式屬性,並掛載 PropertyChangedCallback 即時刷新:

public static readonly DependencyProperty PreviousButtonStyleProperty =
    DependencyProperty.Register(
        "PreviousButtonStyle",
        typeof(Style),
        typeof(MonthCalendar),
        new FrameworkPropertyMetadata((Style)null, new PropertyChangedCallback(OnPreviousButtonStyleChanged)));

public Style PreviousButtonStyle
{
    get { return (Style)GetValue(PreviousButtonStyleProperty); }
    set { SetValue(PreviousButtonStyleProperty, value); }
}

private static void OnPreviousButtonStyleChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
    ((MonthCalendar)d).RefreshPreviousButtonStyle();
}

NextButtonStyle 同理。

3. RefreshNextButtonStyle 實現細節

private void RefreshNextButtonStyle()
{
    ButtonBase nextButton = GetTemplateChild(c_NextButtonName) as ButtonBase;
    if (nextButton != null)
    {
        if (NextButtonStyle == null)
        {
            if (_defaultNextButtonStyle == null)
            {
                _defaultNextButtonStyle = FindResource(new ComponentResourceKey(typeof(MonthCalendar), "NextButtonStyleKey")) as Style;
            }
            nextButton.Style = _defaultNextButtonStyle;
        }
        else
        {
            nextButton.Style = NextButtonStyle;
        }
    }
}

四大注意點

  1. GetTemplateChild 獲取 XAML 中聲明 x:Name 的元素,c_NextButtonName 應公開供使用者調整樣式
  2. TemplatePart 公開模板部件:
    [TemplatePart(Name = "PART_PreviousButton", Type = typeof(ButtonBase))]
    [TemplatePart(Name = "PART_NextButton", Type = typeof(ButtonBase))]
    
  3. 預設樣式隔離:_defaultNextButtonStyle 從 XAML 資源獲取(ComponentResourceKey),避免自定義樣式與預設樣式衝突
  4. OnApplyTemplate 中調用:視覺樹建立後才能獲取 TemplateChild,刷新樣式邏輯必須在 OnApplyTemplate 中執行
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved