0

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

看我的用户控件:

<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 格式和语法颜色的最佳组件。但是,如果您知道另一个比它更好且易于使用的产品,我会接受建议。欢迎任何帮助。

最好的问候,古斯塔沃。

4

1 回答 1

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" />
于 2012-12-06T08:50:43.677 回答