我的Control
ScrollViewer
内有ControlTemplate
Style
(我在ScrollViewer
内),我想访问ScrollSynchronizer
以便与Style
一起工作<!--ZoomControl-->
<Style TargetType="{x:Type local:ZoomBox}">
<Setter Property="ClipToBounds" Value="True"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type local:ZoomBox}">
<ScrollViewer x:Name="ScrollViewer" ClipToBounds="True"
Background="Transparent" SnapsToDevicePixels="True"
UseLayoutRounding="True"
VerticalScrollBarVisibility="Auto"
HorizontalScrollBarVisibility="Auto" >
<Grid x:Name="Grid" RenderTransformOrigin="0.5,0.5"
Background="Transparent" HorizontalAlignment="Center"
VerticalAlignment="Center" SnapsToDevicePixels="True"
UseLayoutRounding="True">
<Grid.LayoutTransform>
<TransformGroup>
<ScaleTransform x:Name="ScaleTransform"/>
</TransformGroup>
</Grid.LayoutTransform>
<Viewbox Grid.Column="0" Grid.Row="0" SnapsToDevicePixels="True"
UseLayoutRounding="True">
<Image Name="ImageCtrl" Source="{TemplateBinding ImageSource,
Converter={StaticResource UriToBitmapConverter}}"
SnapsToDevicePixels="True" UseLayoutRounding="True"/>
</Viewbox>
</Grid>
</ScrollViewer>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
。
http://www.codeproject.com/Articles/39244/Scroll-Synchronization
这里是控件的private static void OnScrollGroupChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
var scrollViewer = d as ScrollViewer;
if (scrollViewer == null && d.GetType() == typeof (ZoomBox))
{
//FindResource always returns null.
scrollViewer = (ScrollViewer)(d as ZoomBox).FindResource("ScrollViewer");
}
//...
}
:
Getter
我试图这样做:
public ScrollViewer GetScrollViewer()
{
return Template.FindName("ScrollViewer", this) as ScrollViewer;
}
我还尝试在自定义控件中创建一个公共OnApplyTemplate()
:
Resources
这个代码在ScrollSynchronization
方法内部时可以使用。但在这种情况下,ScrollViewer
为空或空。
使用AttachedProperty
对<n:ZoomBox x:Name="ZoomBoxControl" util:ScrollSynchronizer.ScrollGroup="Group1"/>
<ScrollViewer x:Name="SideScrollViewer" util:ScrollSynchronizer.ScrollGroup="Group1"/>
元素进行分组时Zoombox
类有效:
OnScrollGroupChanged
因此,在Resource
被解雇之前,AttachedProperty
元素甚至可能尚未初始化。这可以解释为什么Window_OnLoaded
总是空的。
一个可能的解决方案是在窗口加载后通过代码设置ScrollSynchronizer.SetScrollGroup(ZoomBoxControl.GetScrollViewer(), "Canvas");
ScrollSynchronizer.SetScrollGroup(MainScrollViewer, "Canvas");
。
此代码有效,它在OnGroupChanged
事件中运行,我希望我可以使用xaml附加属性。
AttachedProperty
我在调用ZoomBox
后查看了Visual Tree,看起来Template
只在解释to :
L=["11400" , "550" , "1230000" , "30"]
元素时解析,但在初始化之前就解析了( K, M )
。所以尚未加载L1=[23 , 9.7K , 34 , 900]
。
答案 0 :(得分:1)
如果我理解你正在编写一个自定义控件,那么你有一个派生于Control
或FrameworkElement
派生类的类:
刚刚测试过,这对我来说非常适合:
[TemplatePart(Name = "ScrollViewer", Type = typeof(ScrollViewer))]
public class ZoomBox : Control
{
private ScrollViewer _scrollViewerPart;
public override void OnApplyTemplate()
{
_scrollViewerPart = GetTemplateChild("ScrollViewer") as ScrollViewer;
}
public ScrollViewer GetScrollViewer()
{
return _scrollViewerPart;
}
}
MSDN article撰写有关OnApplyTemplate
的信息:
FrameworkElement的派生类可以使用此方法作为各种可能方案的通知:
- 您可以运行依赖于已应用模板的可视化树的代码,例如获取对来自模板的命名元素的引用。