2013-09-25 26 views
3

我在接口有一个自定义的按钮,用下面的样式定义里面:获取的ScrollViewer自定义风格的按钮

<Style x:Key="KinectCustomButton" TargetType="k:KinectCircleButton"> 
     <Setter Property="Template"> 
      <Setter.Value> 
       <ControlTemplate TargetType="k:KinectCircleButton"> 
        <Grid> 
         <Grid.RowDefinitions> 
          <RowDefinition Height="60*"/> 
          <RowDefinition Height="40*"/> 
         </Grid.RowDefinitions> 
         <k:KinectCircleButton Grid.Row="0" VerticalAlignment="Bottom" Foreground="{TemplateBinding Foreground}" Width="{TemplateBinding Width}" Height="{TemplateBinding Height}"> 
          <ContentPresenter x:Name="content"/> 
         </k:KinectCircleButton> 
         <ScrollViewer Grid.Row="1"> 
          <TextBlock TextAlignment="Center" VerticalAlignment="Top" TextWrapping="Wrap" Text="{TemplateBinding Label}" Foreground="{TemplateBinding Foreground}" FontFamily="{TemplateBinding FontFamily}" FontSize="{TemplateBinding FontSize}" FontWeight="{TemplateBinding FontWeight}"/> 
         </ScrollViewer> 
        </Grid> 
       </ControlTemplate> 
      </Setter.Value> 
     </Setter> 
    </Style> 

我在窗口实例化这些按钮中的六个。现在我需要为这些按钮中的每一个访问ScrollViewer元素。 我试过这种方法:How can I find WPF controls by name or type?但它不工作。我也尝试访问我自定义的KinectCustomButton的Template属性,但是如果我试图找到ScrollViewer实例,我会从模板中获取一个,而不是按钮实例中的一个(所以TextBlock里面的文本是空的)。有什么方法可以获得我想要的吗?

+1

'现在我需要为这些按钮中的每一个访问ScrollViewer元素 - 为什么?不要在程序代码中操作UI元素。 –

+0

我在这里做的是在我的scrollviewer元素内部实现自动滚动,所以我需要获得对它们的引用以应用我的自动滚动方法。如果你的意思是这样做会阻止UI线程(或类似的东西),我已经照顾它了 – breathe0

回答

1

要找到ScrollViewer代码,请尝试以下功能GetScrollViewer()

public static DependencyObject GetScrollViewer(DependencyObject Object) 
{ 
    if (Object is ScrollViewer) 
    { 
     return Object; 
    } 

    for (int i = 0; i < VisualTreeHelper.GetChildrenCount(Object); i++) 
    { 
     var child = VisualTreeHelper.GetChild(Object, i); 
     var result = GetScrollViewer(child); 

     if (result == null) 
     { 
      continue; 
     } 
     else 
     { 
      return result; 
     } 
    } 

    return null; 
} 

使用的实例:

if (MyListBox.Items.Count > 0) 
{ 
    ScrollViewer scrollViewer = GetScrollViewer(MyListBox) as ScrollViewer; 

    if (scrollViewer != null) 
    { 
     scrollViewer.ScrollToVerticalOffset(scrollViewer.VerticalOffset + 20); 
    } 
} 

不要操纵程序代码UI元素

我认为,@HighCore,wante d说,使用UI元素的代码,在使用MVVM模板时可能会危及XAML代码和C#代码之间的握手。

这种关系可能导致的问题时,该项目将增加,因此,对于未来,努力实现与附加的行为的帮助下,UI元素的逻辑,命令,这可能在的Style/Template使用UI元素。