0

画面を開発していますが、この画面にはグリッドがあります。このグリッド内に、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" />

繰り返しますが、このグリッド内で他のコンポーネントも同様に機能するため、なぜこれが起こっているのか理解できません。

もう 1 つ: WebBrowser を使用しているのは、これまでのところ、XML を書式設定して構文色で表示するのに最適なコンポーネントであるためです。しかし、より優れた使いやすいものよりも別のものを知っている場合は、提案を受け付けています. どんな助けでも大歓迎です。

よろしく、グスタボ。

4

1 に答える 1

1

私はwebbrowserコントロールを使用して同様の問題を抱えていましたが、最終的にはawesomiumの使用に切り替えて、使用する方がはるかに優れていることがわかりました。

含まれている要素(私の場合はグリッド)のスクロールバーを使用できるように、スクロールバーのないコンテンツに合うようにWebブラウザー(またはWebコントロール)のコンテンツのサイズを変更したいと思いました。また、カスタムコントロールから始めましたが、代わりにバインディングソースを添付プロパティとして追加し、コンテンツが読み込まれたらサイズと可視性を設定するように切り替えました。私の場合、保存された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 に答える