将WebBrowser的主体调整为UserControl

时间:2012-10-26 21:12:39

标签: c# .net wpf user-controls webbrowser-control

我正在开发一个屏幕,这个屏幕我有一个网格。在这个网格中,我有一个UserControl WebBrowser。我正在使用此组件来显示XML格式,并突出显示语法(带颜色)。要显示的文本是通过Binding完成的,因此组件是UserControl,就像接受Binding一样的相同修改所做的那样(因为原始文件不通过Binding接受内容)。但是我遇到了以下问题:当用户在某个点调整程序屏幕大小时,WebBrowser的主体超出了网格的边界,使得屏幕底部的网格很奇怪。 我测试了其他组件,但这个问题没有发生。

看我的UserControl:

<UserControl x: Class = "Geraes.Library.Core.GUI.WPF.Controls.XmlBrowserControl" 
xmlns = "http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns: x = "http://schemas.microsoft.com/winfx/2006/xaml"
x: Name = "thisControl">
   <Grid Margin="0,0,0,0" VerticalAlignment="Stretch" HorizontalAlignment="Stretch">
     <WebBrowser Name="WebBrowser" VerticalAlignment="Stretch" HorizontalAlignment="Stretch" />
   </ Grid>
</ UserControl>

在这里,我如何使用它:

<ct:XmlBrowserControl XmlDoc="{Binding ContentString}" Grid.Row="1" />

同样,我无法理解为什么会发生这种情况,因为其他组件在此网格中也能正常工作。

另一件事:我们正在使用WebBrowser,因为在此刻之前,它是显示XML格式和语法颜色的最佳组件。但如果你知道另一个比它更好更容易使用,我接受建议。 欢迎任何帮助。

祝你好运, 古斯塔沃。

1 个答案:

答案 0 :(得分:1)

我在使用webbrowser控件时遇到了类似的问题,最后我转而使用awesomium并发现使用它更好。

我想调整webbrowser(或webcontrol)的内容以适应没有滚动条的内容,这样我就可以使用包含元素的滚动条(在我的例子中是一个网格)。我也开始使用自定义控件,但后来切换到将绑定源添加为附加属性,并在内容加载后设置大小和可见性。我的情况是我使用你本地存储的html字符串,但你可以使用uri而不是

using System;
using System.Windows;
using Awesomium.Windows.Controls;
using Awesomium.Core;

namespace utilities
{

    public class WebBrowserHelper {

        public static readonly DependencyProperty BodyProperty =
            DependencyProperty.RegisterAttached("Body", typeof (string), typeof(WebBrowserHelper), new PropertyMetadata(OnBodyChanged));

        public static string GetBody(DependencyObject dependencyObject) {
            return (string) dependencyObject.GetValue(BodyProperty);
        }

        public static void SetBody(DependencyObject dependencyObject, string body) {
            dependencyObject.SetValue(BodyProperty, body);
        }

        private static void ScrollDataReceivedDelegate(object sender, ScrollDataEventArgs e)
        {
            var webControl = (Awesomium.Windows.Controls.WebControl) sender;
            webControl.Height = e.ScrollData.ContentHeight;
            webControl.Width = e.ScrollData.ContentWidth;
            webControl.Visibility = Visibility.Visible;
        }

        private static void OnBodyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) {
            var webControl = (Awesomium.Windows.Controls.WebControl) d;
            webControl.LoadHTML((string)e.NewValue);
            webControl.ScrollDataReceived += new ScrollDataReceivedEventHandler(ScrollDataReceivedDelegate);
            webControl.LoadCompleted += delegate {
                webControl.RequestScrollData();
            };
        }
    }
}

名称空间:

xmlns:utilities="clr-namespace:utilities;assembly=utilities"
xmlns:awesome="clr-namespace:Awesomium.Windows.Controls;assembly=Awesomium.Windows.Controls"

和xaml:

<awesome:WebControl 
    HorizontalAlignment="Left" 
    Width="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type Grid}}, Path=ActualWidth}" 
    Height="1" 
    utilities:WebBrowserHelper.Body="{Binding html}" 
    Visibility="Collapsed" />