无法在 WPF XAML 中转换对象

我正在尝试从 TextBox 的上下文绑定到 WebBrowser 组件。

即使调试成功,XamlDesign 也会返回 InvalidCastException 错误。有人可以帮我解决这个问题吗?

我的WPF项目基于示例项目(https://www.codeproject.com/Articles/1097390/Displaying-HTML-in-a-WPF-RichTextBox),下载的项目也返回相同的错误。

我的WPF项目中的代码如下:

主窗口.xaml

<Window x:Class="Wpf_HTML_display.MainWindow"

        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"

        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"

        xmlns:local="clr-namespace:Wpf_HTML_display"

        mc:Ignorable="d"

        Height="1176" Width="1920" WindowState="Maximized">

<Canvas>

    <TextBox x:Name="srcHTML" Height="292" Width="1753" AcceptsReturn="True">&lt;p&gt;&lt;/p&gt;</TextBox>

    <WebBrowser x:Name="WebBrowser1" local:WebBrowserBehavior.Body="{Binding ElementName=srcHTML, Path=Text}"  Height="838" Width="1743" Canvas.Left="10" Canvas.Top="297" />

</Canvas>

</Window>

WebBrowserBehavior 类

public class WebBrowserBehavior

{

    public static readonly DependencyProperty BodyProperty =

        DependencyProperty.RegisterAttached("Body", typeof(string), typeof(WebBrowserBehavior),

        new PropertyMetadata(OnChanged));


    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 OnChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) =>

        ((WebBrowser)d).NavigateToString((string)e.NewValue);

}

XamlDesign 返回:


Unable to cast object of type 'Microsoft.VisualStudio.DesignTools.WpfDesigner.InstanceBuilders.HwndHostInstance' to type 'System.Windows.Controls.WebBrowser'.


不负相思意
浏览 109回答 1
1回答

收到一只叮咚

发生这种情况是因为构造函数或加载的事件或InitializeComponent需要一些数据(一些基本数据来加载控件布局。您可以检查异常的 stackstrace,它都是关于类中的内容UIElement并生成要在窗口上显示的控件),而这些数据在设计时不存在时间。有时,设计器无法传递有关自定义绑定表达式的正确信息。在这种情况下,在准备好处理字符串或内容OnChanged之前被调用。WebBrowser简单的解决方案是最初保持TextBox为空,然后从后面的代码中赋值:srcHTML.Text = @"&lt;p&gt;&lt;/p&gt;";将一些验证OnChanged放入WebBrowserBehavior:if (!string.IsNullOrEmpty((string)e.NewValue)){&nbsp; &nbsp; ((WebBrowser)d).NavigateToString((string)e.NewValue);}else{&nbsp; &nbsp; // CODE TO CLEAR CONTENT}简而言之,就是让所有控件先加载再执行操作。已测试并工作。
打开App,查看更多内容
随时随地看视频慕课网APP