2009-09-30 36 views
5

Đây là bước đột phá đầu tiên của tôi vào các điều khiển tùy chỉnh và nó không hoạt động tốt. Tôi có một điều khiển biểu đồ tùy chỉnh bắt nguồn từ Canvas.Điều khiển tùy chỉnh wpf không được công nhận

namespace Grapher2 { 
    public class SeriesManager : Canvas { 
     public SeriesManager() { 
      ... 
     } 
    } 
} 

Được xác định trong cùng một dự án và không gian tên như ứng dụng của tôi. Tôi đã cố gắng thêm một tham chiếu đến sự kiểm soát trong XAML như sau:

<Window x:Class="Grapher2.Window1" 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
xmlns:graph="clr-namespace:Grapher2" 
Title="Grapher" Width="800" Height="600"> 

<StackPanel Name="container" Width="700" Height="500"> 
    <graph:SeriesManager Name="seriesManager" Width="700" Height="500" /> 
</StackPanel> 

Nhưng khi tôi cố gắng để tham khảo các tên kiểm soát "seriesManager" trong code-behind cho Window, tôi nhận được "Tên 'seriesManager' không tồn tại trong ngữ cảnh hiện tại. "

Hơn nữa, trình chỉnh sửa XAML sẽ không hiển thị Cửa sổ, tạo ra một dấu vết ngăn xếp lớn với lỗi: "Loại" MS.Internal.Permissions.UserInitiatedNavigationPermission 'trong Assembly' PresentationFramework, Version = 3.0.0.0, Culture = neutral, PublicKeyToken = 31bf3856ad364e35 'không được đánh dấu là có thể tuần tự hóa được. "

Tôi tưởng tượng giải pháp là điều gì đó ngu ngốc đơn giản đối với bất kỳ ai đã thực hiện kiểm soát tùy chỉnh. Nhưng tôi đang bối rối.

Trả lời

11

bạn đã thử x: Name = "seriesManager" trong xaml của bạn chưa?

Chỉnh sửa: Đây có thể không phải là vấn đề nhìn thấy cách bạn nói xaml của bạn không hiển thị. Tôi đoán một khi bạn nhận được xaml để render trong nhà thiết kế ... mã phía sau sẽ hoạt động tốt hơn.

Chỉnh sửa 2: Bất cứ khi nào tôi gặp sự cố với trình diễn thiết kế, đó là vì tôi đang làm điều gì đó trong hàm tạo của điều khiển tùy chỉnh của mình. Kiểm tra SeriesManager của bạn để xem bạn có đang làm gì đó trong hàm tạo của nó đang gây ra sự cố hay không. Có lẽ bạn đang tham khảo một cái gì đó mà không tồn tại được nêu ra. Nếu bạn có thêm mã trong constructor của bạn, hãy xem xét chuyển nó sang sự kiện UserControl_Loaded.

+4

x: Tên là bắt buộc đối với các tham chiếu trong cùng một assembly, điều này sẽ khắc phục được vấn đề không thể tham chiếu "seriesManager" trong đoạn mã phía sau. thêm thông tin: http://stackoverflow.com/questions/1380112/why-cant-i-use-the-name-attribute-on-usercontrol-in-the-same-assembly – Zenuka

+0

Oh và BTW sử dụng x: Name thay thế Tên có thể khắc phục tất cả các vấn đề của bạn, hãy thử điều này trước và cho chúng tôi biết nếu có nhiều vấn đề hơn ... – Zenuka

+1

x: Tên đã sửa lỗi! Cảm ơn! – Klay

0

Sao lưu câu trả lời của Scott ở đây, kể từ khi ông đã giúp tôi giải quyết nó:

Những gì tôi đã sai đã cố gắng để truy cập kiểm soát TRƯỚC InitializeComponent(), nhưng đã bị nhầm lẫn bởi 2 thông báo lỗi khác ở một nơi khác trong các mã. Chỉ trong trường hợp người khác có lỗi này.

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