2010-08-19 89 views
1

我與衍生自定義控件實驗,我創造了什麼,我認爲將是一個最簡單的推導:派生自定義控件入門?

  • 我在VS 2010中創建一個自定義的控制項目,改變了基類CustomControl1從ControlCalendar

  • 然後我進入Generic.xaml並刪除了爲CustomControl1創建的默認樣式。

  • 最後,我創建了一個WPF應用程序來使用該控件。

當我添加自定義控制應用程序的主窗口,我希望看到一個普通WPF日曆,因爲我已經從Calendar衍生並提出不更改日曆控件模板。

相反,在設計時或運行時沒有任何東西出現。 MainWindow保持空白。我不確定發生了什麼事情,但很明顯,我在某個地方做了一個錯誤的假設。

任何人都可以爲我清除它嗎?謝謝你的幫助。

順便說一句 - 我爲什麼要這樣做?我正在擴展Calendar控件,但我只需要修改CalendarDayButton控件模板。在我進行修改之前,我想我應該能夠首先顯示未修改的日曆。就像我說的,我認爲我在某個地方做出了錯誤的假設。

CustomControl1.cs 這裏是CustomControl1代碼:

using System.Windows; 
using System.Windows.Controls; 

namespace WpfCustomControlLibrary1 
{ 
    public class CustomControl1 : Calendar 
    { 
      static CustomControl1() 
      { 
       DefaultStyleKeyProperty.OverrideMetadata(typeof(CustomControl1), new FrameworkPropertyMetadata(typeof(CustomControl1))); 
      } 
    } 
} 

Generic.xaml 這裏是標記爲Generic.xaml,它位於該控件的主題文件夾:

<ResourceDictionary 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:local="clr-namespace:WpfCustomControlLibrary1"> 


</ResourceDictionary> 

MainWindow Fi應受,這裏是MainWindow.xaml標記:

<Window x:Class="WpfApplication1.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 

     xmlns:WpfCustomControlLibrary1="clr-namespace:WpfCustomControlLibrary1;assembly=WpfCustomControlLibrary1" Title="MainWindow" Height="350" Width="525"> 
    <Grid> 
     <WpfCustomControlLibrary1:CustomControl1 /> 
    </Grid> 
</Window> 

WpfApplication1包含對WpfCustomControlLibrary1項目的引用。

+0

由我實際上從你刪除的問題下載了FSCalender項目,雖然我沒有VS2010我確實設法看到控制,所以你有什麼是正確的,它可能是一個問題,正確構建它。 – NVM 2010-08-19 18:59:03

+0

謝謝 - 我刪除了之前的問題,因爲它很長很複雜。這是一個更簡單的版本。 – 2010-08-19 19:17:25

回答

4

DefaultStyleKeyProperty.OverrideMetadata(typeof(CustomControl1),new FrameworkPropertyMetadata(typeof(CustomControl1)));

- >什麼這行說的是,CustomControl1具有然後,我走進Generic.xaml並取消CustomControl1創建的默認風格Generic.xaml

定義其默認樣式。

- >這樣做是刪除的默認樣式CustomControl1

所以你的控件沒有樣式,以便它顯示什麼:d

而不是從一般的刪除樣式。XAML,您應該複製的風格的日曆控制和改變的TargetType到CustomControl1或創建新的樣式,並添加支持算法FMP日曆

編輯到一些更多的信息添加到下面大衛的答案的人有一個往下看道路

<Style TargetType="{x:Type local:FsCalendar}" BasedOn={x:Type Calender}> 
    <Setter Property="CalendarDayButtonStyle" Value="{StaticResource FsCalendarDayButtonStyle}" /> 
</Style> 

這就是你所需要的風格。 BasedOn將負責複製默認樣式中的所有內容,它還將處理不同的主題。如果您從日曆的默認主題中複製樣式,您將打破所有主題的外觀,除了複製「默認」樣式的主題外。

+0

@David。這是你的回答 – Berryl 2010-08-19 19:01:07

+0

謝謝 - 日曆還沒有出現。如果我只修改CalendarDayButton,是否必須將所有日曆控件tempolates包含在我的Generic.xaml中? Michael Detras對EggheadCafe的自定義控制(http://www.eggheadcafe.com/tutorials/aspnet/88c6f252-ba7f-4789-97e8-1bd7690ca385/styling-the-wpf-calendar-to-resemble-outlooks-month-view-日曆。aspx)似乎只包含他修改的控件模板。 – 2010-08-19 19:56:19

+0

糟糕 - 第二次看,Detras包含所有模板。我想我有我的答案。 – 2010-08-19 19:58:09

1

我找到了我的答案 - 非常感謝NVM的幫助!這通常適用於控件,但它特別適用於日曆控件。如果您只想修改部分控件,則不必包含所有組件控件模板。

但是,您必須包含指向自定義控件的主控件模板,並且必須建立從主控件到要修改的模板的鏈。在我的Calendar控件的情況下,我只需要修改CalendarDayButton模板來實現我想要做的更改。所以,這是我做的:

  • 我包括主日曆模板,並指向我的自定義控件。

  • 然後,爲了進入CalendarDayButton,我添加了一個屬性設置器,將我的主日曆樣式的CalendarDayButtonStyle屬性指向我的自定義CalendarDayButton樣式。

這裏是我的Generic.xaml文件的主要日曆樣式聲明最終看起來像:

<!-- Calendar Style --> 
<Style TargetType="{x:Type local:FsCalendar}"> 
    <Setter Property="CalendarDayButtonStyle" Value="{StaticResource FsCalendarDayButtonStyle}" /> 
... 
</Style> 

的主要日曆風格的其餘部分是不變的 - 它的一個副本默認樣式。

順便說一句,CalendarDayButton樣式定義必須出現在Generic.xaml的主日曆樣式定義之前,否則主Calendar樣式將無法找到它。

我寫了一個代碼項目文章標題爲Extending the WPF Calendar Control。它介紹了擴展複雜控件(如WPF日曆)所涉及的步驟。希望它能幫助那些解決相同問題的人。

0

順便說一句,我已經發現了Style.BasedOn屬性,它可以讓你從現有的風格派生一個風格,而不必重複基礎風格。有一個good blog post on it here

+0

鏈接暫停atm ... – 2016-02-16 06:33:31