我的界面中有一个自定义按钮,使用以下样式定义:
<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文本为空)。有什么方法可以获得我想要的东西吗?
答案 0 :(得分: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想要说的是,UI元素的代码的使用,在使用MVVM模板时可能会损害XAML代码和C#代码之间的联系。
当项目增加时,这样的关系可能会导致问题,因此,为了将来,尝试在附加的行为,命令的帮助下实现UI元素的逻辑,这些命令可以在Style
中使用UI元素的/ Template
。