2011-01-24 47 views
5

Tôi đang sử dụng GetTemplateChild như sau, nhưng nó luôn trả về NULL. Làm thế nào để sửa lỗi này?GetTemplateChild luôn trả về giá trị rỗng

[TemplatePart(Name = "textPoints", Type = typeof(TextBlock))] 
textPoints = (TextBlock)GetTemplateChild("TextBlock"); 
+0

Bạn đã bao giờ tìm thấy giải pháp cho điều này chưa? Câu trả lời của _Reed Copsey_ là chính xác cho thông tin bạn đã cung cấp nhưng nếu điều này vẫn không hoạt động thì có lẽ bạn có thể đăng mẫu kiểm soát của mình vì có thể chứa lỗi. –

+1

Theo kinh nghiệm của tôi, không an toàn khi gọi 'FrameworkElement.GetTemplateChild()' trước 'FrameworkElement.OnApplyTemplate()' được gọi. Hãy thử phân lớp kiểm soát và ghi đè 'OnApplyTemplate()'. – kevinarpe

Trả lời

4

GetTemplateChild lấy tên như một tham số, không phải là loại. Kể từ XAML của bạn được định nghĩa là:

<TextBlock Text="{Binding}" Foreground="Cyan" 
    x:Name="textPoints" 

Hãy thử qua "textPoints" thay vì "TextBlock" như tên gọi để lấy:

[TemplatePart(Name = "textPoints", Type = typeof(TextBlock))] 
textPoints = (TextBlock)GetTemplateChild("textPoints"); 
+0

Thnaks, tôi đã thử với mã bên dưới, tôi vẫn nhận được kết quả tương tự (ví dụ, NULL) textPoints = (TextBlock) GetTemplateChild ("textPoints"); Tôi thiếu một số thinng? – codematrix

+0

Không, Trong phương thức dưới đây, công khai ghi đè void OnApplyTemplate(). Các GetTemplateChild khác đang hoạt động. Tôi có vấn đề cho chỉ TextBlock này. Đó là một phần của . GetTemplateChild() có hoạt động trong trường hợp này không? – codematrix

2

Hình như bạn đang cố gắng để có được đứa trẻ mẫu của một số kiểm soát khác, từ nơi bạn đang gọi GetTemplateChild?

Nếu ItemsControl của bạn nằm trong một số UserControl thì GetTemplateChild sẽ không hoạt động khi trẻ em trong UserControl của bạn không phải là một phần của mẫu con và nó sẽ không đệ quy tìm kiếm mẫu con của mỗi đứa trẻ.

Chủ yếu GetTemplateChild được sử dụng trong Điều khiển tùy chỉnh.

+0

Nhìn vào mã trên, nó hoạt động cho x: Name = "PointsList" nhưng không phải x: Name = "textPoints". Bạn có thể ném một số ánh sáng? GetTemplateChild() có hoạt động trong trường hợp này không? – codematrix

+0

Không, nó sẽ không hoạt động, bởi vì GetTemplateChild sẽ chỉ tìm kiếm tên con trong mẫu hiện tại, hộp văn bản của bạn không phải là bên trong currny Mẫu nó là bên trong mẫu của mẫu con. Bạn sẽ phải tạo một điều khiển tùy chỉnh khác có nguồn gốc từ ItemsControl, tuy nhiên nếu điều khiển của bạn nằm bên trong mục mẫu thì bạn cũng sẽ cần phải tạo mục chứa như là điều khiển tùy chỉnh riêng biệt. –

+0

Mẫu con là loại phần tử riêng tư cho điều khiển hiện tại, chỉ cha mẹ sở hữu mẫu mới có thể truy cập mẫu con, tuy nhiên bạn có thể điều hướng VisualTree và tiếp cận với điều khiển con ở bất kỳ đâu. Ngoài ra ItemsControl sẽ có nhiều điều khiển với cùng tên cho mỗi mục, vậy làm thế nào GetTemplateChild sẽ trả lại mục nào? –

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