如何访问元素

时间:2016-02-24 21:02:03

标签: c# wpf resources datatemplate

我的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总是空的。

编辑2:

一个可能的解决方案是在窗口加载后通过代码设置ScrollSynchronizer.SetScrollGroup(ZoomBoxControl.GetScrollViewer(), "Canvas"); ScrollSynchronizer.SetScrollGroup(MainScrollViewer, "Canvas");

编辑3:

此代码有效,它在OnGroupChanged事件中运行,我希望我可以使用xaml附加属性。

AttachedProperty

我在调用ZoomBox后查看了Visual Tree,看起来Template只在解释to : L=["11400" , "550" , "1230000" , "30"]元素时解析,但在初始化之前就解析了( K, M )。所以尚未加载L1=[23 , 9.7K , 34 , 900]

1 个答案:

答案 0 :(得分:1)

如果我理解你正在编写一个自定义控件,那么你有一个派生于ControlFrameworkElement派生类的类:

刚刚测试过,这对我来说非常适合:

[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的派生类可以使用此方法作为各种可能方案的通知:

     
      
  • 您可以运行依赖于已应用模板的可视化树的代码,例如获取对来自模板的命名元素的引用。
  •