У меня есть CustomControl, который использует ScrollViewer.Следующий код является примером, который показывает мой вариант использования простым способом:
<Style TargetType="controls:MyCustomControl">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="controls:MyCustomControl">
<Grid x:Name="LayoutRoot" Background="White">
<Grid.RowDefinitions>
<RowDefinition />
<RowDefinition Height="20"/>
<RowDefinition Height="20"/>
</Grid.RowDefinitions>
<ScrollViewer x:Name="scrollViewer" Grid.Row="0"
Height="300" Width="400"
VerticalScrollBarVisibility="Auto"
HorizontalScrollBarVisibility="Auto"
Style="{StaticResource ScrollViewerStyle}">
<Canvas x:Name="outer" Width="400" Height="400"
Background="Red" Margin="50">
<Canvas x:Name="inner" Background="Green"
Width="400" Height="400">
<Canvas.RenderTransform>
<ScaleTransform ScaleX="{Binding Value, ElementName=slider}"
ScaleY="{Binding Value, ElementName=slider}"/>
</Canvas.RenderTransform>
</Canvas>
</Canvas>
</ScrollViewer>
<Slider x:Name="slider" Minimum="0.1" Maximum ="10"
Value="1" Grid.Row="2"/>
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
Я не учел несоответствующий CodeBehind, принадлежащий Slider.ValueChanged.
Inеще один вопрос, который я задаю Как мне вставить элементы управления в ScrollViewer .В этом ответе у меня появилась идея шаблонизировать ScrollViewer.Я добавил некоторые элементы в ScrollViewer, как показано в ответе.Например, у меня есть новый Canvas внутри моего ScrollViewer:
<Canvas x:Name="canvas"/>
Мне нужен доступ к этому Canvas во время выполнения, поэтому в WPF я создал:
public class MyScrollViewer : ScrollViewer
Я переопределяю OnApplyTemplate
и получаю к нему доступ через GetTemplateChild
.Итак, все сделано.
В SL этот способ невозможен, поскольку ScrollViewer запечатан.
Теперь я ищу другой способ получить доступ.Я надеялся, что VisualTreeHelper поможет мне, но я не получаю Canvas.Ни в CodeBehind моего пользовательского элемента управления, ни в codebehind-ах моей MainPage (где я использую свой элемент управления).
private void GetCanvas(DependencyObject dependencyObject)
{
int count = VisualTreeHelper.GetChildrenCount(dependencyObject);
for (int i = 0; i < count; i++)
{
DependencyObject child = VisualTreeHelper.GetChild(dependencyObject);
Canvas canvas = child as Canvas;
if (canvas == null)
{
GetCanvas(child);
}
else
{
// Code here if found
}
}
}
Тогда коллега помнит меня, что существует директива x: FieldModifier.Я никогда не использовал это раньше, только слышал об этом.Я даю ему попытку.
x:FieldModifier="public"
Но не знаю, действительно ли это даст мне возможность получить доступ из-за кода, еще меньше как.
Итак, есть ли способ, как я мог получить доступна моем холсте во время выполнения в Silverlight?Может быть, есть другое решение в самом WPF, которое также работает на SL?