我正在嘗試從 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"><p></p></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'.
1 回答

收到一只叮咚
TA貢獻1821條經驗 獲得超5個贊
發生這種情況是因為構造函數或加載的事件或InitializeComponent需要一些數據(一些基本數據來加載控件布局。您可以檢查異常的 stackstrace,它都是關于類中的內容UIElement并生成要在窗口上顯示的控件),而這些數據在設計時不存在時間。有時,設計器無法傳遞有關自定義綁定表達式的正確信息。
在這種情況下,在準備好處理字符串或內容OnChanged之前被調用。WebBrowser
簡單的解決方案是最初保持TextBox為空,然后從后面的代碼中賦值:
srcHTML.Text = @"<p></p>";
將一些驗證OnChanged放入WebBrowserBehavior:
if (!string.IsNullOrEmpty((string)e.NewValue))
{
((WebBrowser)d).NavigateToString((string)e.NewValue);
}
else
{
// CODE TO CLEAR CONTENT
}
簡而言之,就是讓所有控件先加載再執行操作。
已測試并工作。
- 1 回答
- 0 關注
- 215 瀏覽
添加回答
舉報
0/150
提交
取消