#silverlight-4.0 #transform
#silverlight-4.0 #преобразовать
Вопрос:
У меня есть средство просмотра прокрутки, содержащее холст:
<ScrollViewer x:Name="scrollViewer" Margin="0" Grid.RowSpan="2" >
<i:Interaction.Triggers>
<!-- stuff-->
</i:Interaction.Triggers>
<Border>
<Canvas x:Name="MapCanvas" Background="{Binding BackgroundColor}" Width="7200" Height="3200" >
<Canvas.RenderTransform>
<ScaleTransform />
</Canvas.RenderTransform>
<i:Interaction.Behaviors>
<!-- stuff-->
</i:Interaction.Behaviors>
<i:Interaction.Triggers>
<!-- stuff-->
</i:Interaction.Triggers>
</Canvas>
</Border>
Этот код вызывает исключение: «Значение не попадает в ожидаемый диапазон».
var generalTransform = scrollViewer.TransformToVisual(MapCanvas);
Любые подсказки о причинах этого были бы оценены. Заглянув в онлайн-справку, я не смог найти документацию о том, какие исключения может выдавать TransformToVisual или почему.
ОБНОВЛЕНИЕ: Есть ли q способ протестировать ScrollViewer и / или MapCanvas, чтобы убедиться, что вызов TransformToVisual будет успешным?
Ответ №1:
Возможно, я полностью ошибаюсь, но я подозреваю, что это может быть проблема с синхронизацией.
Если я сделаю
private void UserControl_Loaded(object sender, System.Windows.RoutedEventArgs e)
{
timer = new DispatcherTimer();
timer.Interval = new TimeSpan(0, 0, 0, 0, 20);
timer.Tick = (s, e2) =>
{
var generalTransform = scrollViewer.TransformToVisual(MapCanvas);
timer.Stop();
};
timer.Start();
}
ошибка больше не возникает…
Я предполагаю, это потому, что элементы управления не были «визуально» показаны на экране?
Ответ №2:
Вы можете вызвать TransformToVisual только для элемента, который виден на экране и уже размещен
Комментарии:
1. Спасибо за ответ. Есть ли какой-либо способ проверить, был ли элемент выложен, прежде чем мы вызовем TransformToVisual?
2. Вы могли бы добавить флаг, для которого установлено значение true при загруженном событии ScrollViewer, и false при выгруженном событии. Затем проверьте, имеет ли флаг значение true, прежде чем вызывать TransformToVisual