对于便签annotation,有没有办法从后面的代码中提取文本?
根据接受的答案,这就是我使用的
List<string> stickiesText = new List<string>();
foreach (Annotation annotation in service.Store.GetAnnotations())
{
if (annotation.AnnotationType != null)
{
Debug.WriteLine(annotation.AnnotationType.ToString());
if (annotation.AnnotationType.ToString().EndsWith("TextStickyNote"))
{
string base64Text = annotation.Cargos[1].Contents[0].InnerText;
byte[] decoded = Convert.FromBase64String(base64Text);
MemoryStream m = new MemoryStream(decoded);
Section section = XamlReader.Load(m) as Section;
m.Close();
TextRange range = new TextRange(section.ContentStart, section.ContentEnd);
Debug.WriteLine(range.Text);
stickiesText.Add(range.Text);
}
}
}
答案 0 :(得分:1)
Wow. Yes, there is, but they don't make it easy. What a kerfuffle.
Based on the examples shown here: Pro WPF 4.5 in C#: Windows Presentation Foundation in .NET 4.5, Matthew MacDonald, and here: Introduction to Annotations.
XAML:
<Window x:Class="MvvmLight5.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:annot="clr-namespace:System.Windows.Annotations;assembly=PresentationFramework"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:ignore="http://www.ignore.com"
xmlns:local="clr-namespace:MvvmLight5.Model"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
Title="MVVM Light Application"
Width="Auto"
Height="Auto"
DataContext="{Binding Main,
Source={StaticResource Locator}}"
Loaded="OnLoaded"
Unloaded="OnUnloaded"
mc:Ignorable="d ignore">
<Grid x:Name="LayoutRoot">
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="300" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<!-- Viewer and simple content -->
<ToolBarTray Grid.Row="0">
<!-- Annotations Toolbar -->
<ToolBar>
<!-- StickyNote Operations -->
<GroupBox Header="Notes">
<StackPanel Orientation="Horizontal">
<Button Width="30"
Command="annot:AnnotationService.CreateTextStickyNoteCommand"
Content="Text" />
<Button Width="30"
Command="annot:AnnotationService.CreateInkStickyNoteCommand"
Content="Ink" />
<Button Width="50"
Command="annot:AnnotationService.DeleteStickyNotesCommand"
Content="Delete" />
</StackPanel>
</GroupBox>
</ToolBar>
</ToolBarTray>
<FlowDocumentPageViewer Name="Viewer" Grid.Row="1">
<FlowDocument>
<Paragraph>This is a simple example of a flow document and how you can add annotations to one.</Paragraph>
<Paragraph>Later we'll get more complicated content...</Paragraph>
</FlowDocument>
</FlowDocumentPageViewer>
<Button Grid.Row="2"
Width="50"
Height="50"
Click="Button_Click" />
</Grid>
</Window>
Codebehind:
// Turn Annotations On.
protected void OnLoaded(object sender, RoutedEventArgs e)
{
// Make sure that an AnnotationService isn’t already enabled.
AnnotationService service = AnnotationService.GetService(Viewer);
if (service == null)
{
// (a) Create a Stream for the annotations to be stored in.
AnnotationStream =
new FileStream("annotations.xml", FileMode.OpenOrCreate);
// (b) Create an AnnotationService on our
// FlowDocumentPageViewer.
service = new AnnotationService(Viewer);
// (c) Create an AnnotationStore and give it the stream we
// created. (Autoflush == false)
AnnotationStore store = new XmlStreamStore(AnnotationStream);
// (d) "Turn on annotations". Annotations will be persisted in
// the stream created at (a).
service.Enable(store);
}
}
// Turn Annotations off.
protected void OnUnloaded(object sender, RoutedEventArgs e)
{
// (a) Check that an AnnotationService actually
// existed and was Enabled.
AnnotationService service =
AnnotationService.GetService(Viewer);
if (service != null && service.IsEnabled)
{
// (b) Flush changes to annotations to our stream.
service.Store.Flush();
// (c) Turn off annotations.
service.Disable();
// (d) Close our stream.
AnnotationStream.Close();
}
}
// The stream that we will store annotations in.
Stream AnnotationStream;
private void Button_Click(object sender, RoutedEventArgs e)
{
AnnotationService service =
AnnotationService.GetService(Viewer);
if (service != null && service.IsEnabled)
{
var annotation = service.Store.GetAnnotations().ElementAt(0);
string base64Text = annotation.Cargos[1].Contents[0].InnerText;
byte[] decoded = Convert.FromBase64String(base64Text);
MemoryStream m = new MemoryStream(decoded);
Section section = XamlReader.Load(m) as Section;
m.Close();
TextRange range = new TextRange(section.ContentStart, section.ContentEnd);
MessageBox.Show(range.Text);
}
}