我的目标与this question相似 但我仍然无法回答我的问题
因此,我需要使用WYSIWYG HTML编辑支持来设计和生成报告模板。和上面的问题一样,我在WPF中使用了WebBrowser控件。最大的问题是WPF WebBrowser在designMode设置为on后始终将null设置为HTML。所以我将WinForm WebBrowser托管到我的应用程序中。设置或从WebBrowser处理HTML文档是非常困难的。
问:
更新
我有这两个附加属性用于MVVM目的。因此,我可以使用HTMLSource获取/设置HTML,并在应用启动时设置设计模式。
IsDesignMode
public static readonly DependencyProperty IsDesignModeProperty =
DependencyProperty.RegisterAttached("IsDesignMode", typeof (Boolean), typeof (WebBrowserHelper),
new UIPropertyMetadata(false, IsDesignModePropertyChanged));
public static Boolean GetIsDesignMode(DependencyObject obj)
{
return (Boolean)obj.GetValue(IsDesignModeProperty);
}
public static void SetIsDesignMode(DependencyObject obj, Boolean value)
{
obj.SetValue(IsDesignModeProperty, value);
}
public static void IsDesignModePropertyChanged(DependencyObject obj, DependencyPropertyChangedEventArgs args)
{
WebBrowser browser = obj as WebBrowser;
if (browser != null)
{
Boolean designMode = (Boolean) args.NewValue;
if(designMode)
{
browser.LoadCompleted += (s, e) =>
{
var htmlDoc = (s as WebBrowser).Document as IHTMLDocument2;
htmlDoc.body.setAttribute("contenteditable", "true");
htmlDoc.designMode = "On";
};
}
else
{
browser.LoadCompleted += (s, e) =>
{
var htmlDoc = (s as WebBrowser).Document as IHTMLDocument2;
htmlDoc.body.setAttribute("contenteditable", "false");
htmlDoc.designMode = "Off";
};
}
}
}
HTMLSource
public static readonly DependencyProperty HTMLSourceProperty =
DependencyProperty.RegisterAttached("HTMLSource", typeof (String), typeof (WebBrowserHelper),
new UIPropertyMetadata(null, HTMLSourcePropertyChanged));
public static String GetHTMLSource(DependencyObject obj)
{
return (String)obj.GetValue(HTMLSourceProperty);
}
public static void SetHTMLSource(DependencyObject obj, String value)
{
obj.SetValue(HTMLSourceProperty, value);
}
public static void HTMLSourcePropertyChanged(DependencyObject o, DependencyPropertyChangedEventArgs args)
{
WebBrowser browser = o as WebBrowser;
if (browser != null)
{
browser.NavigateToString(args.NewValue as String);
}
}
查看
<UserControl x:Class="Delay.View.LayoutView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:browser="clr-namespace:Delay.Helper"
xmlns:cal="http://www.caliburnproject.org"
xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity">
<UserControl.Resources>
<Style x:Key="ButtonStyle" TargetType="Button">
<Setter Property="Width" Value="100" />
<Setter Property="Height" Value="40" />
<Setter Property="Margin" Value="2.5,0" />
<Setter Property="ContentTemplate">
<Setter.Value>
<DataTemplate>
<StackPanel>
<ContentPresenter Content="{TemplateBinding Content}"
TextBlock.FontSize="15" />
</StackPanel>
</DataTemplate>
</Setter.Value>
</Setter>
</Style>
</UserControl.Resources>
<Grid Background="Lavender">
<DockPanel>
<TextBlock HorizontalAlignment="Center" Text="Layout Designer"
DockPanel.Dock="Top" FontSize="20" />
<WebBrowser Name="webBrowser" HorizontalAlignment="Stretch" DockPanel.Dock="Top" Margin="8" Height="435"
browser:WebBrowserHelper.HTMLSource="{Binding HtmlPage}" browser:WebBrowserHelper.IsDesignMode="True" />
<StackPanel Orientation="Horizontal" DockPanel.Dock="Bottom" HorizontalAlignment="Center">
<StackPanel Orientation="Vertical" Margin="5,0">
<ComboBox ItemsSource="{Binding LayoutTags}" SelectedItem="{Binding SelectedTag}"
HorizontalAlignment="Stretch" Margin="0,5" MinWidth="100">
<ComboBox.ItemTemplate>
<DataTemplate>
<TextBlock FontSize="12" Text="{Binding TagName}" />
</DataTemplate>
</ComboBox.ItemTemplate>
</ComboBox>
<ListBox ItemsSource="{Binding LayoutValueTypes}" SelectedItem="{Binding SelectedType}"
Width="{Binding ElementName=cmbTag, Path=ActualWidth}" Height="70">
<ListBox.ItemTemplate>
<DataTemplate>
<TextBlock FontSize="12" Text="{Binding TypeName}" />
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
</StackPanel>
<StackPanel Orientation="Vertical">
<StackPanel Orientation="Horizontal">
<CheckBox Name="IsDesignMode" Content="Design Mode" TextBlock.FontSize="12">
<i:Interaction.Triggers>
<i:EventTrigger EventName="Checked">
<cal:ActionMessage MethodName="DesignModeOnOff">
<cal:Parameter Value="{Binding ElementName=webBrowser}" />
<cal:Parameter Value="{Binding IsDesignMode}" />
</cal:ActionMessage>
</i:EventTrigger>
</i:Interaction.Triggers>
</CheckBox>
</StackPanel>
<Button Name="PutComponent" Style="{StaticResource ButtonStyle}"
Content="Put" />
<Button Name="SaveLayout" Style="{StaticResource ButtonStyle}"
Content="Save" />
</StackPanel>
</StackPanel>
</DockPanel>
</Grid>
</UserControl>
答案 0 :(得分:1)
答案 1 :(得分:0)
我写了一个非常简单的WPF应用程序,它使用嵌入式资源作为HTML,并包含以下代码:
Stream s = GetType().Assembly.GetManifestResourceStream("WpfApplication5.HTMLPage1.htm");
webBrowser1.NavigateToStream(s);
IHTMLDocument2 doc = webBrowser1.Document as IHTMLDocument2;
doc.designMode = "On";
代码按预期工作,我可以编辑页面的内容 - 一旦我按照你的建议将它设置为designMode,它就没有被删除。也许从上面的代码开始,检查一下你可以使用它。