2010-02-17 37 views
6

Tôi đang sử dụng System.Windows.Controls.WebBrowser cho nhiều thứ khác nhau trong ứng dụng của mình và tôi đã nhận thấy rằng adorner bị cắt khi chúng được cho là xuất hiện trên WebBrowser. Tôi nhận ra rằng điều khiển WebBrowser thực sự là một wrapper xung quanh một thành phần COM và có thể ám khác nhau, nhưng tôi tự hỏi nếu có ai tìm ra cách để giải quyết điều này.Hiển thị một Adorner trên một điều khiển WebBrowser

Đây là vấn đề tôi thấy. Ở đây tôi chỉ có một adorner mẫu được cho là vẽ một vòng tròn màu đỏ lớn ở góc trên cùng của một thứ gì đó (như một mẫu).

Khi tôi tô điểm cho các WebBrowser với điều này, tôi nhận được kết quả này:

tôi mong đợi để xem vòng tròn đầy đủ.

Dưới đây là các mã cho adorner vô giá trị này, trong trường hợp đó là hữu ích:

public class SillyAdorner : Adorner 
{ 
    public SillyAdorner(UIElement element) : base(element) 
    { 

    } 
    protected override void OnRender(DrawingContext drawingContext) 
    { 
     drawingContext.DrawEllipse(new SolidColorBrush(Colors.Red), new Pen(), new Point(7, 7), 30, 30); 
     base.OnRender(drawingContext); 
    } 
} 

Và đây là cách tôi áp dụng nó vào các trình duyệt trong phương pháp OnRender của điều khiển host:

protected override void OnRender(DrawingContext drawingContext) 
    { 
     base.OnRender(drawingContext);    
     var layer = AdornerLayer.GetAdornerLayer(browser); 
     layer.Add(new SillyAdorner(browser)); 
    } 

Bất cứ ai có bất kỳ hacks hoặc cách giải quyết cho điều này?

Chỉnh sửa: Tôi đang sử dụng .NET 4.0, nếu điều đó tạo nên sự khác biệt.

Chỉnh sửa # 2: WebBrowser dường như thừa hưởng từ HwndHost, mà tôi đã nhìn thấy một câu hỏi hoặc hai liên quan đến adorners và hwndsources, nhưng tôi không nhìn thấy bất cứ điều gì giống như tôi có thể thực hiện nó cho WebControl, nhưng hy vọng đây là thông tin hữu ích cho ai đó.

Trả lời

2

Điều này là do airspace issues. Vì WebBrowser là một điều khiển gốc, không phải WPF, không có cách nào để trực tiếp hiển thị các adorner (hoặc nội dung WPF khác) trên đầu trang của nó.

Để thực hiện việc này, bạn cần phải sử dụng một cửa sổ riêng biệt của một số loại và đặt nội dung đó vào cửa sổ riêng biệt đó. Điều này thường có nghĩa là sử dụng một cửa sổ WPF trong suốt nằm trên đầu cửa sổ chính của bạn. Thật không may, điều này sẽ không được tích hợp một giải pháp như một điều khiển WPF bản địa thực sự sẽ cung cấp.

5

Tôi không nghĩ rằng nó sẽ làm việc với một Adroner, nhưng bạn có thể nổi nội dung trên một điều khiển WebBroswer bằng cách sử dụng một điều khiển Popup minh bạch. Bạn có thể tìm thêm chi tiết và mẫu mã here.

+0

Vâng .... Tôi đã thấy ở nơi khác. Có vẻ như điều này là bởi vì một popup cũng là một hwnd, vì vậy đó là tiện dụng. Điều duy nhất ở đây là cắt bỏ trang trí để trang trí các vật thể khác xung quanh nó. Tôi sẽ cập nhật câu trả lời của tôi để phản ánh điều này. Đề nghị rất tốt mặc dù ... Tôi có thể thấy về gói adorner của tôi trong một hwnd. –

1

Hãy thử sử dụng một số transparent TOP LEVEL overlay window khác. Chỉ hỗ trợ trên Windows 2000 hoặc cao hơn của khóa học, Win9x không có cửa sổ lớp.

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