如何将垂直滚动条移动到出现单词的视口 - FlowDocument
How to move vertical scrollbar to the viewport where found word occured - FlowDocument
我的 XAML 文件中有以下带段落的 FlowDocument:
<FlowDocumentScrollViewer ScrollViewer.HorizontalScrollBarVisibility="Auto" ScrollViewer.VerticalScrollBarVisibility="Auto">
<FlowDocument Name="fDocument" PagePadding="10" FontFamily="Segoe UI" FontSize="22">
<Paragraph Name="fdParagraph">
Those who have denied the reality of moral distinctions, may be
ranked among the disingenuous disputants; nor is it conceivable,
that any human creature could ever seriously believe, that all
characters and actions were alike entitled to the affection and
regard of everyone. The difference, which nature has placed
between one man and another, is so wide, and this difference is
still so much farther widened, by education, example, and habit,
that, where the opposite extremes come at once under our
apprehension, there is no scepticism so scrupulous, and scarce
any assurance so determined, as absolutely to deny all
distinction between them. Let a man's insensibility be ever so
great, he must often be touched with the images of Right and
Wrong; and let his prejudices be ever so obstinate, he must
observe, that others are susceptible of like impressions. The
only way, therefore, of converting an antagonist of this kind, is
to leave him to himself.
</Paragraph>
</FlowDocument>
</FlowDocumentScrollViewer>
有时,我的文本内容可能会比较大,不适合当前的视口。
是否可以以及如何将垂直滚动条移动到出现单词的视口?
为此,您需要将 TextPointer
的垂直位置置于 FlowDocument
中,并调用 ScrollViewer
方法 ScrollToVerticalOffset
。
简而言之,是这样的:
public static class FlowDocumentExtensions
{
public static void ScrollToWord(
this FlowDocument flowDocument,
ScrollViewer scrollViewer,
string word)
{
var currentText = flowDocument.ContentStart;
while (true)
{
TextPointer nextText =
currentText.GetNextContextPosition(
LogicalDirection.Forward);
if (nextText == null)
return;
TextRange txt = new TextRange(currentText, nextText);
int index = txt.Text.IndexOf(word, StringComparison.Ordinal);
if (index > 0)
{
TextPointer start = currentText.GetPositionAtOffset(index);
if (start != null)
{
var rect = start.GetCharacterRect(
LogicalDirection.Forward);
scrollViewer.ScrollToVerticalOffset(rect.Y);
}
return;
}
currentText = nextText;
}
}
}
如果您想了解如何从 FlowDocument
获取 ScrollViewer
:Scroll a WPF FlowDocumentScrollViewer from code?
我的 XAML 文件中有以下带段落的 FlowDocument:
<FlowDocumentScrollViewer ScrollViewer.HorizontalScrollBarVisibility="Auto" ScrollViewer.VerticalScrollBarVisibility="Auto">
<FlowDocument Name="fDocument" PagePadding="10" FontFamily="Segoe UI" FontSize="22">
<Paragraph Name="fdParagraph">
Those who have denied the reality of moral distinctions, may be
ranked among the disingenuous disputants; nor is it conceivable,
that any human creature could ever seriously believe, that all
characters and actions were alike entitled to the affection and
regard of everyone. The difference, which nature has placed
between one man and another, is so wide, and this difference is
still so much farther widened, by education, example, and habit,
that, where the opposite extremes come at once under our
apprehension, there is no scepticism so scrupulous, and scarce
any assurance so determined, as absolutely to deny all
distinction between them. Let a man's insensibility be ever so
great, he must often be touched with the images of Right and
Wrong; and let his prejudices be ever so obstinate, he must
observe, that others are susceptible of like impressions. The
only way, therefore, of converting an antagonist of this kind, is
to leave him to himself.
</Paragraph>
</FlowDocument>
</FlowDocumentScrollViewer>
有时,我的文本内容可能会比较大,不适合当前的视口。
是否可以以及如何将垂直滚动条移动到出现单词的视口?
为此,您需要将 TextPointer
的垂直位置置于 FlowDocument
中,并调用 ScrollViewer
方法 ScrollToVerticalOffset
。
简而言之,是这样的:
public static class FlowDocumentExtensions
{
public static void ScrollToWord(
this FlowDocument flowDocument,
ScrollViewer scrollViewer,
string word)
{
var currentText = flowDocument.ContentStart;
while (true)
{
TextPointer nextText =
currentText.GetNextContextPosition(
LogicalDirection.Forward);
if (nextText == null)
return;
TextRange txt = new TextRange(currentText, nextText);
int index = txt.Text.IndexOf(word, StringComparison.Ordinal);
if (index > 0)
{
TextPointer start = currentText.GetPositionAtOffset(index);
if (start != null)
{
var rect = start.GetCharacterRect(
LogicalDirection.Forward);
scrollViewer.ScrollToVerticalOffset(rect.Y);
}
return;
}
currentText = nextText;
}
}
}
如果您想了解如何从 FlowDocument
获取 ScrollViewer
:Scroll a WPF FlowDocumentScrollViewer from code?