2010-05-30 21 views
11

Tôi có một Custom Control trong đó sử dụng một số điều khiển PHẦN:OnApplyTemplate không được gọi trong Custom Control

[TemplatePart(Name = "PART_TitleTextBox", Type = typeof(TextBox))] 
    [TemplatePart(Name = "PART_TitleIndexText", Type = typeof(Label))] 
    [TemplatePart(Name = "PART_TimeCodeInText", Type = typeof(TextBlock))] 
    [TemplatePart(Name = "PART_TimeCodeOutText", Type = typeof(TextBlock))] 
    [TemplatePart(Name = "PART_ApprovedImage", Type = typeof(Image))] 
    [TemplatePart(Name = "PART_CommentsImage", Type = typeof(Image))] 
    [TemplatePart(Name = "PART_BookmarkedImage", Type = typeof(Image))] 
    public class TitleBoxNew : Control 
    { 
     static TitleBoxNew() 
     { 
      DefaultStyleKeyProperty.OverrideMetadata(
       typeof(TitleBoxNew), 
       new FrameworkPropertyMetadata(typeof(TitleBoxNew))); 
     } 

     public TitleBoxNew() { } 

     // ... rest of class 
    } 

kiểm soát này được trọng OnApplyTemplate:

public override void OnApplyTemplate() 
{ 
     base.OnApplyTemplate(); 

     InitializeEvents(); 
} 

nào hoạt động tốt, hầu hết thời gian. Tôi đã thêm điều khiển bên trong một điều khiển tab tùy chỉnh trong một cửa sổ và bằng cách nào đó OnApplyTemplate không bao giờ được gọi cho điều khiển đó! Tại sao điều này không hoạt động như tôi mong đợi?

+4

-1 cho mất bình tĩnh của bạn. – zneak

+6

bạn là thành viên lần đầu tiên và bạn đang sử dụng từ F. Hãy thử để xem nếu cộng đồng này thích nó trước khi đăng nó. – vladv

+2

-1 cho ngôn ngữ. –

Trả lời

3

Tôi không thể nhìn thấy constructor của bạn, nhưng đừng quên để thiết lập DefaultStyleKey:

DefaultStyleKeyProperty.OverrideMetadata(typeof(TitleBoxNew), new FrameworkPropertyMetadata(typeof(TitleBoxNew))); 
+0

Vâng tôi có đề cập đến điều đó, tôi đã có điều này: tĩnh TitleBoxNew() { DefaultStyleKeyProperty.OverrideMetadata (typeof (TitleBoxNew), new FrameworkPropertyMetadata (typeof (TitleBoxNew))); } công khai TitleBoxNew() { } –

+0

Gói stackoverflow đẹp, được thực hiện tốt –

+10

Vui lòng chỉnh sửa bài đăng orignal của bạn để chứa hàm tạo của bạn; nhận xét không phải là vị trí chính xác cho mã. –

37

Đối với bất kỳ ai khác có thể vấp ngã khi bài này, tôi đã có cùng một vấn đề và tôi quản lý để giải quyết nó bằng cách thêm dòng sau vào AssemblyInfo.cs của dự án bao gồm điều khiển tùy chỉnh của tôi: template

[assembly: ThemeInfo(
    ResourceDictionaryLocation.None, //where theme specific resource dictionaries are located 
    //(used if a resource is not found in the page, 
    // or application resource dictionaries) 
    ResourceDictionaryLocation.SourceAssembly //where the generic resource dictionary is located 
    //(used if a resource is not found in the page, 
    // app, or any theme specific resource dictionaries) 
)] 

kiểm soát của tôi nằm trong file Theme/Generic.xaml trong cùng một dự án như kiểm soát.

+2

Điều này đã lưu ngày của tôi. Theo nghĩa đen. Cảm ơn rất nhiều. –

+1

Điều này giải quyết vấn đề của tôi sau khi chúng tôi di chuyển một số điều khiển tùy chỉnh WPF đến một thư viện lớp C# thường được ban đầu không được tạo ra như là một "WPF Custom Control Library". BTW: Cũng đã thêm phần tử XML cần thiết vào .csproj để nâng cấp thư viện lớp thành thư viện lớp WPF "thực". – candritzky

20

Hai câu trả lời khác là chính xác ... nhưng chưa hoàn thành. Theo số this post (và kinh nghiệm của tôi về giải quyết vấn đề này) có 4 thứ bạn cần kiểm tra: (vì lý do nào đó, các khối mã trong bài đăng này sẽ không được định dạng nếu tôi sử dụng số hoặc dấu gạch ngang ...)

A. Mẫu và kiểu điều khiển phải được đặt trong tệp Generic.xaml một thư mục có tên là Themes của thư mục gốc của dự án của bạn.

B. Hãy chắc chắn rằng không gian tên của bạn là chính xác trong Generic.xaml

C. Set phím phong cách trong các nhà xây dựng tầm kiểm soát của bạn. Nó cũng được đề nghị rộng rãi bạn đặt sau đây trong một constructor tĩnh.

static YourControl() 
{ 
     DefaultStyleKeyProperty.OverrideMetadata(typeof(YourControl), new FrameworkPropertyMetadata(typeof(YourControl))); 
} 

D. Đảm bảo sau đây là trong AssemblyInfo.cs bạn

[assembly: ThemeInfo(ResourceDictionaryLocation.None, 
//where theme specific resource dictionaries are located 
//(used if a resource is not found in the  
// or application resource dictionaries) 
ResourceDictionaryLocation.SourceAssembly 
//where the generic resource dictionary is located 
//(used if a resource is not found in the page, 
// app, or any theme specific resource dictionaries) 
)] 
+0

Bước 'A' là đủ để giải quyết vấn đề của tôi cảm ơn! ('uwp') – rubStackOverflow

1

Tôi sẽ thêm câu trả lời của riêng tôi vì cả hai câu trả lời trên là không đầy đủ như tôi đã phải vật lộn với vấn đề này đối với một số Hiện tại.

Như đã nói bởi MoMo và Kai G trên:

A. Các điều khiển mẫu và phong cách nên được đặt trong Generic.xaml nộp thư mục có tên Chủ đề của thư mục gốc của dự án của bạn.

B. Đảm bảo không gian tên của bạn chính xác trong Generic.xaml

C. Đặt khóa kiểu trong bộ tạo điều khiển của bạn.

D. Đảm bảo các thuộc tính chủ đề có trong AssemblyInfo.cs nộp

NHƯNG bạn cũng cần phải đảm bảo rằng tập tin Generic.xaml của bạn được đặt cho các hành động xây dựng như Trang: Không sao chép.

Nếu bạn không thực hiện việc này hoặc giá trị bằng cách nào đó được đặt thành thứ gì đó khác, phương pháp OnApplyTemplate() sẽ không được gọi.

+0

Phần D có tầm quan trọng đặc biệt, IMO. –

1

trả lời của @MoMo là đúng, nhưng bổ sung:

E: Người ta cho rằng các Themes/Generic.xaml là trong thư mục gốc của dự án của bạn. Nếu đây không phải là trường hợp và Generic.xaml của bạn không phải là trong thư mục gốc thì bạn phải tạo một thư mục Themes với Generic.xaml trong thư mục gốc (Generic.xaml chỉ là kiểu ResourceDictionary). Trong Generic.xaml bạn cần tham chiếu đến vị trí của Generic.xaml của bạn.

ví dụ .:

<ResourceDictionary Source="/Foo.Bar;component/Controls/FooControl/Themes/Generic.xaml" />

Các vấn đề liên quan