【问题标题】:Get ScrollViewer inside a custom styled button在自定义样式按钮中获取 ScrollViewer
【发布时间】:2023-04-01 23:17:01
【问题描述】:

我的界面中有一个自定义按钮,使用以下样式定义:

<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 的文本是空的)。有什么方法可以得到我想要的吗?

【问题讨论】:

  • Now I need to access the ScrollViewer element for each one of these buttons - 有什么用?不要在程序代码中操纵 UI 元素。
  • 我在这里所做的是在我的滚动查看器元素中实现自动滚动,因此我需要获取对它们的引用才能应用我的自动滚动方法。如果你的意思是这样做会阻塞 UI 线程(或类似的东西),我已经处理好了

标签: c# wpf xaml controltemplate scrollviewer


【解决方案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 元素代码的使用,形成了 XAML 代码和 C# 代码之间的夹缝,在使用 MVVM 模板时可能会妥协。

这样的关系在项目增加的时候可能会出现问题,所以,未来尝试借助附加的行为、命令来实现UI元素的逻辑,可以在Style/@ UI 元素的 987654326@。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多