基本上,我正在开发一个笔记应用,用户可以只要他想(有点像键入滚动文本框在WP7 )。 我把文本框在一个ScrollViewer中,并且一切都很好; 我禁用的ScrollViewer当文本框获得焦点,所以它会自动滚动当用户输入。
我的问题是,我希望用户能够在编辑注滚动,就像他能够在阅读笔记中滚动。 我认为这样做将是按住,直到出现过大的插入符号的唯一途径,然后移动它,但我发现,其实,第三方应用程序支持这种类型的滚动。
我试图做到的,是像手机,其中在编辑文档的用户可以轻松地滚动字/ OneNote中( 这里有一个视频展示了它)。 同样的效果是出现在Skype和Facebook应用程序,其中,在写邮件时,你可以滚动它,看多了吧。
我不知道这是一个自定义的控制,或者如果布局是在一个特定的方式设计,因为一个ScrollViewer中内一个TextBox根本不起作用。
我会很感激的任何帮助。 提前致谢。
基于由Ku6opr给出了答案,我调整了代码,所以它的作品在我的情况。 现在,文本框具有规则的行为,而是滚动的,而RootFrame不会自动上去。
XAML:
<Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
<ScrollViewer x:Name="InputScrollViewer">
<TextBox x:Name="MessageText" TextWrapping="Wrap" Text="" AcceptsReturn="True" TextChanged="inputText_TextChanged" GotFocus="MessageText_GotFocus" Padding="0,0,0,400" Tap="MessageText_Tap" />
</ScrollViewer>
</Grid>
C#:
public partial class MainPage : PhoneApplicationPage
{
double InputHeight = 0.0;
// Constructor
public MainPage()
{
InitializeComponent();
}
private void MessageText_GotFocus(object sender, System.Windows.RoutedEventArgs e)
{
(App.Current as App).RootFrame.RenderTransform = new CompositeTransform();
}
private void inputText_TextChanged(object sender, System.Windows.Controls.TextChangedEventArgs e)
{
Dispatcher.BeginInvoke(() =>
{
double CurrentInputHeight = MessageText.ActualHeight;
if (CurrentInputHeight > InputHeight)
{
InputScrollViewer.ScrollToVerticalOffset(InputScrollViewer.VerticalOffset + CurrentInputHeight - InputHeight);
}
InputHeight = CurrentInputHeight;
});
}
public void MessageText_Tap(object sender, GestureEventArgs e)
{
InputScrollViewer.ScrollToVerticalOffset(e.GetPosition(MessageText).Y - 80);
}
}
分路器的事件处理程序检测抽头的垂直位置,和滚动的ScrollViewer所以插入符是鉴于当文本框获得焦点。
也许这不是一个最佳的解决方案,但它的工作:
XAML:
<Grid x:Name="LayoutRoot" Background="Transparent">
<ScrollViewer x:Name="InputScrollViewer" Margin="12,0" Height="800" VerticalAlignment="Top">
<StackPanel Orientation="Vertical" Margin="0,12">
<TextBlock TextWrapping="Wrap" Text="Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed in ligula augue. Morbi facilisis varius enim in congue. Nam vehicula imperdiet ipsum in ullamcorper. Integer quis augue in dui tincidunt elementum. Nulla in mi mauris, eu laoreet leo. Sed vehicula quam nec leo imperdiet a rutrum felis viverra." Style="{StaticResource PhoneTextNormalStyle}" Margin="12,12,12,0"/>
<TextBlock TextWrapping="Wrap" Text="Morbi molestie facilisis eleifend. Cras volutpat, lectus nec tincidunt accumsan, mi purus faucibus purus, vitae semper mauris lacus id mauris. Fusce eget massa ut magna lacinia gravida. Ut id velit purus. Nullam eu mi ac justo imperdiet pretium. Curabitur vehicula congue purus vitae sollicitudin." Style="{StaticResource PhoneTextNormalStyle}" Margin="12,12,12,0"/>
<TextBlock TextWrapping="Wrap" Text="Aenean eget dui a urna commodo faucibus sit amet nec eros. Nam tempus facilisis urna, ut varius justo euismod sit amet. Vivamus ultrices volutpat tortor in viverra. Vestibulum laoreet odio at tellus consectetur ut convallis quam semper. Duis in iaculis lectus. Aliquam erat volutpat. Nulla facilisi. Quisque vitae metus lorem. Fusce et erat nisl, sit amet gravida libero. Cras elementum eros vitae tellus sollicitudin accumsan. Pellentesque egestas luctus bibendum. Duis eros ipsum, mollis ut laoreet eu, consectetur id lectus. Maecenas viverra risus urna." Style="{StaticResource PhoneTextNormalStyle}" Margin="12,12,12,0"/>
<TextBox x:Name="MessageText" TextWrapping="Wrap" Text="" AcceptsReturn="True" TextChanged="inputText_TextChanged" GotFocus="MessageText_GotFocus" LostFocus="MessageText_LostFocus"/>
</StackPanel>
</ScrollViewer>
</Grid>
后台代码:
public partial class MainPage : PhoneApplicationPage
{
bool IsInputFocused = false;
double InputHeight = 0.0;
double KeyboardHeight = 338;
double KeyboardClipboardHeight = 72;
double RootHeight = 800;
public MainPage()
{
InitializeComponent();
DeviceStatus.KeyboardDeployedChanged += new EventHandler(DeviceStatus_KeyboardDeployedChanged);
}
void DeviceStatus_KeyboardDeployedChanged(object sender, EventArgs e)
{
if (IsInputFocused)
{
UpdateKeyboard();
}
}
private void inputText_TextChanged(object sender, System.Windows.Controls.TextChangedEventArgs e)
{
Dispatcher.BeginInvoke(() =>
{
double CurrentInputHeight = MessageText.ActualHeight;
if (CurrentInputHeight > InputHeight)
{
InputScrollViewer.ScrollToVerticalOffset(InputScrollViewer.VerticalOffset + CurrentInputHeight - InputHeight);
}
InputHeight = CurrentInputHeight;
});
}
private void UpdateKeyboard()
{
(App.Current as App).RootFrame.RenderTransform = new CompositeTransform();
if (!DeviceStatus.IsKeyboardDeployed)
{
InputScrollViewer.Height = RootHeight - (KeyboardHeight + GetClipboardHeight());
}
else
{
InputScrollViewer.Height = RootHeight;
}
}
private double GetClipboardHeight()
{
return (Clipboard.ContainsText()) ? KeyboardClipboardHeight : 0;
}
private void MessageText_GotFocus(object sender, System.Windows.RoutedEventArgs e)
{
IsInputFocused = true;
(App.Current as App).RootFrame.RenderTransform = new CompositeTransform();
UpdateKeyboard();
Dispatcher.BeginInvoke(() =>
{
InputScrollViewer.ScrollToVerticalOffset(InputScrollViewer.VerticalOffset + 338 + GetClipboardHeight());
});
}
private void MessageText_LostFocus(object sender, System.Windows.RoutedEventArgs e)
{
IsInputFocused = false;
InputScrollViewer.Height = RootHeight;
}
}
首先这个代码禁用的转型Frame
时(向上移动) TextBox
被聚焦。 此外,该代码执行新的免费屏幕高度的管理,当键盘在屏幕上。